为了避免使用.size
手动加载字段,我想实现Hibernate4Module
。不幸的是,在所有配置上都是新手,我似乎无法使其发挥作用。我从java获得的只有:Could not write content: could not initialize proxy - no Session
。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"servlet.controller"})
public class ServletConfig extends WebMvcConfigurerAdapter {
...
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
ObjectMapper mapper = null;
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJackson2HttpMessageConverter) {
mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
}
}
if (mapper == null) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(mapper = new ObjectMapper());
converters.add(converter);
}
Hibernate4Module hbm = new Hibernate4Module();
hbm.enable(Feature.FORCE_LAZY_LOADING);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.registerModule(hbm);
}
...
}
有谁能看到我在这里做错了什么?
注意
我一直在遇到一些效率缺点,我正在研究在DTO之外减轻它们的可能性。我对DTO方法非常熟悉,我目前正在处理的软件包含60个名为“Ext * .java”的文件(包含使用Gson的DTO)。这些中的每一个都在100到1000行之间并且基本上增加了控制器方法的长度。此外,我们将尝试添加更多单元测试。因此,我迫切希望找到一种消除尽可能多的DTO代码的方法。也就是说,我根本不反对在需要时使用DTO,事实上我刚完成了我的第一次StdSerializer。
美国大陆约有20人参与了一个项目,我只是希望能够在混乱中施加一些秩序。
答案 0 :(得分:1)
这是正常的,你得到了这个例外Hibernate4Module
不会让会话保持打开状态,但它并不存在。如果您希望将EntityManager / Session保持为请求作用域,则可以使用OpenEntityManagerInViewInterceptor。
要在Java配置中注册,您必须添加WebMvcConfigurerAdapter
类:
@Autowired
private EntityManagerFactory emf;
@Override
public void addInterceptors(InterceptorRegistry registry) {
OpenEntityManagerInViewInterceptor interceptor = new OpenEntityManagerInViewInterceptor();
interceptor.setEntityManagerFactory(emf);
registry.addWebRequestInterceptor(interceptor);
}
但我不建议将其与Jackson一起用于多种原因。
首先它被称为Anti-pattern,你应该在实现它之前考虑所有的含义(连接背后的时间更长,关注分离......)。另外,根据您的JPA模型,你冒险加载所有数据库,你将不得不处理与Jackson的无限递归。
手动触发延迟加载乍一看可能看起来很痛苦,但这加上使用DTO(数据传输对象)对我来说是最持久的解决方案。