微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring 5 公开会议在视图中

如何解决Spring 5 公开会议在视图中

我正在尝试使用 Spring 5 实现 OpenSessionInView 模式(反模式)。我通过 Java(不是 xml)在我的 WebMvcConfigurer 中配置了 OpenSessionInView,并查看似乎已经在运行的日志。但是,当我尝试加载一个惰性集合时,它会显示已知的“无法编写 JSON:未能延迟初始化角色集合:...”

疯狂的事情是我在日志中看到的:

DEBUG [http-nio-8080-exec-7] (OpenSessionInViewInterceptor.java:128) - opening Hibernate Session in OpenSessionInViewInterceptor
DEBUG [http-nio-8080-exec-7] (AbstractPlatformTransactionManager.java:370) - Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById]: PROPAGATION_required,ISOLATION_DEFAULT,readOnly
DEBUG [http-nio-8080-exec-7] (JpaTransactionManager.java:393) - Opened new EntityManager [SessionImpl(1867707287<open>)] for JPA transaction
DEBUG [http-nio-8080-exec-7] (DriverManagerDataSource.java:144) - Creating new JDBC DriverManager Connection to [jdbc:MysqL://MYIP:3306/DB_NAME?useUnicode=true&useJDBCCompliantTimezoneshift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Madrid]
DEBUG [http-nio-8080-exec-7] (DataSourceUtils.java:186) - Setting JDBC Connection [com.MysqL.cj.jdbc.ConnectionImpl@2e6ff9ac] read-only
DEBUG [http-nio-8080-exec-7] (TransactionImpl.java:56) - On TransactionImpl creation,JpaCompliance#isJpaTransactionComplianceEnabled == false
...
...
...
WARN [http-nio-8080-exec-7] (AbstractHandlerExceptionResolver.java:199) - Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Failed to lazily initialize a collection of role: com....Route.styles,Could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Failed to lazily initialize a collection of role...
DEBUG [http-nio-8080-exec-7] (OpenSessionInViewInterceptor.java:153) - Closing Hibernate Session in OpenSessionInViewInterceptor

因此,会话似乎按原样打开,但在引发异常时并未关闭。但是我的 EntityManager 没有使用那个会话......我说得对吗?我怎样才能做到这一点?

谢谢!

编辑:

我的 WebConfig.java:

@Configuration
@ComponentScan
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

@Value( "${resources.files.location}" )
private String fileLocation;

@Autowired
DataSource datasource;

@Autowired
private Environment env;

@Bean
public ResourceBundleMessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("Messages");
    messageSource.setCacheMillis(10);
    return messageSource;
}

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver localeResolver = new SessionLocaleResolver();
    localeResolver.setDefaultLocale(Locale.getDefault());
    return localeResolver;
}

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
    localeInterceptor.setIgnoreInvalidLocale(true);
    localeInterceptor.setParamName("idioma");
    return localeInterceptor;
}

@Bean
public PlatformTransactionManager hibernateTransactionManager() {
    HibernateTransactionManager transactionManager
            = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionfactorybean().getobject());
    return transactionManager;
}

@Bean
public ViewResolver internalResourceViewResolver() {
    InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();

    internalResourceViewResolver.setPrefix("/WEB-INF/views/");
    internalResourceViewResolver.setSuffix(".jsp");
    return internalResourceViewResolver;
}

public void addInterceptors(InterceptorRegistry registry) {
    OpenSessionInViewInterceptor openSessionInViewInterceptor = new OpenSessionInViewInterceptor();
    openSessionInViewInterceptor.setSessionFactory(sessionfactorybean().getobject());

    registry.addWebRequestInterceptor(openSessionInViewInterceptor).addpathPatterns("/**");

    registry.addInterceptor(new miLoggerInterceptor());
    registry.addInterceptor(localeChangeInterceptor());
}

@Bean
public FilterRegistrationBean openEntityManagerInViewFilter() {
    FilterRegistrationBean reg = new FilterRegistrationBean();
    reg.setName("OpenEntityManagerInViewFilter");
    reg.setFilter(new OpenEntityManagerInViewFilter());
    return reg;
}

@Bean
public LocalSessionfactorybean sessionfactorybean() {
    LocalSessionfactorybean sessionFactory = new LocalSessionfactorybean();
    sessionFactory.setDataSource(datasource);
    sessionFactory.setPackagesToScan("my.package");
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
}

private Properties hibernateProperties() {
    Properties jpaProperties = new Properties();
    jpaProperties.put("hibernate.hbm2ddl.auto",env.getProperty("hibernate.hbm2ddl.auto"));
    jpaProperties.put("hibernate.show_sql",env.getProperty("hibernate.show_sql"));
    jpaProperties.put("hibernate.format_sql",env.getProperty("hibernate.format_sql"));
    return jpaProperties;
}

public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    registry.addResourceHandler("/css/**").addResourceLocations("/css/");
    registry.addResourceHandler("/img/**").addResourceLocations("/img/");
    registry.addResourceHandler("/.well-kNown/acme-challenge/**").addResourceLocations("/.well-kNown/acme-challenge/");
    registry.addResourceHandler("/webfonts/**").addResourceLocations("/webfonts/");
    registry.addResourceHandler("/multimedia/").addResourceLocations("file:"+fileLocation);

    registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/meta-inf/resources/");
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/meta-inf/resources/webjars/");

    registry.addResourceHandler("/files/**").addResourceLocations("file:///C:/tmp/images/");
    registry.addResourceHandler("/favico.ico").addResourceLocations("/favico.ico");
}

}

BusinessConfig.java:

@Configuration
@ComponentScan
@PropertySources({
    @PropertySource("classpath:application.properties"),})
@EnableJpaRepositories("com.muskers.web.business.repositories")
public class BusinessConfig {

@Autowired
private Environment env;

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(env.getProperty("db.driver"));
    dataSource.setUrl(env.getProperty("db.url"));
    dataSource.setUsername(env.getProperty("db.username"));
    dataSource.setPassword(env.getProperty("db.password"));
    return dataSource;
}

@Bean
public PasswordEncoder delegatingPasswordEncoder() {
    PasswordEncoder defaultEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
    Map<String,PasswordEncoder> encoders = new HashMap<>();
    encoders.put("bcrypt",new BCryptPasswordEncoder());
    encoders.put("scrypt",new SCryptPasswordEncoder());
    encoders.put("pbkdf2",new Pbkdf2PasswordEncoder());

    DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(
            "bcrypt",encoders);
    passwordEncoder.setDefaultPasswordEncoderForMatches(defaultEncoder);
    return passwordEncoder;
}

@Bean
public LocalContainerEntityManagerfactorybean entityManagerFactory() {

    LocalContainerEntityManagerfactorybean emf = new LocalContainerEntityManagerfactorybean();
    emf.setDataSource(dataSource());
    emf.setPackagesToScan(User.class.getPackage().getName());

    HibernateJpavendorAdapter hibernateJpa = new HibernateJpavendorAdapter();
    hibernateJpa.setDatabase(Database.MysqL);
    hibernateJpa.setDatabasePlatform(env.getProperty("hibernate.dialect"));
    hibernateJpa.setGenerateDdl(env.getProperty("hibernate.generateDdl",Boolean.class));
    hibernateJpa.setShowsql(env.getProperty("hibernate.show_sql",Boolean.class));
    emf.setJpavendorAdapter(hibernateJpa);

    Properties jpaProperties = new Properties();
    jpaProperties.put("hibernate.hbm2ddl.auto",env.getProperty("hibernate.format_sql"));
    emf.setJpaProperties(jpaProperties);

    return emf;
}

@Bean
public JpaTransactionManager transactionManager() {
    JpaTransactionManager txnMgr = new JpaTransactionManager();
    txnMgr.setEntityManagerFactory(entityManagerFactory().getobject());
    return txnMgr;
}

@postconstruct
public void setTimeZone() {
    TimeZone.setDefault(TimeZone.getTimeZone("Europe/Madrid"));
}

public class Roles {
    public final static String ROLE_USER = "USER";
    public final static String ROLE_ADMIN = "ADMIN";
}

public class Authorities {
    public final static String MANAGE_GYMS = "MANAGE_GYMS";
    public final static String MANAGE_USERS = "MANAGE_USERS";
    public final static String READ_GYMS = "READ_GYMS";
    public final static String CREATE_GYMS = "CREATE_GYMS";
    public final static String CREATE_ROUTES = "CREATE_ROUTES";
    public final static String READ_ROUTES = "READ_ROUTES";
    public final static String MANAGE_ROUTES = "MANAGE_ROUTES";
}
}

App.java:

public class App  extends AbstractAnnotationConfigdispatcherServletinitializer
{
@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { BusinessConfig.class,WebSecurityConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };
}

@Override
protected String[] getServletMappings() {
    return new String[] { "/" };
}

@Override
protected Filter[] getServletFilters() {
    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");
    return new Filter[] { characterEncodingFilter};
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。