【问题标题】:Spring Hibernate Jackson Hibernate5ModuleSpring Hibernate Jackson Hibernate5Module
【发布时间】:2016-11-11 10:26:12
【问题描述】:

我已经使用 Hibernate 5.1.0 和 Jackson 2.7.5 设置了 spring 4.3.1

我有一些惰性初始化异常,因为当我退出事务服务时,Jackson ObjectMapper 会尝试将我的对象转换为延迟。

因此,我已经阅读了 Jackson 的 Hibernate5Module。

添加模块后,我没有得到惰性异常,但所有 @JsonView 注释都被忽略了,我的惰性集合为“空”

public class SpringWebConfig extends WebMvcConfigurerAdapter {

    ...


    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) {
                ObjectMapper mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();
                mapper.registerModule(new Hibernate5Module());
            }
        }

    }

}

我做错了什么吗? Hibernate5Module 应该初始化惰性集合 ...

【问题讨论】:

    标签: spring hibernate jackson


    【解决方案1】:

    让它与以下内容一起工作

    @EnableWebMvc
    @Configuration
    @ComponentScan({ "..." })
    public class SpringWebConfig extends WebMvcConfigurerAdapter {
    
        @Autowired
        SessionFactory sf;
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    
            Hibernate5Module module = new Hibernate5Module(sf);
            module.disable(Feature.USE_TRANSIENT_ANNOTATION);
            module.enable(Feature.FORCE_LAZY_LOADING);
    
            Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
            builder.modulesToInstall(module);
    
            converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    
        }
    
    }
    

    【讨论】:

    • Spring 5 怎么样? WebMvcConfigurerAdapter 类现已弃用。
    • 你必须直接实现WebMvcConfigurer
    • 但是为什么要强制延迟加载呢?延迟加载的重点不是默认不加载吗?
    【解决方案2】:

    我设法使它与下面的实现一起工作

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    
        Hibernate5Module module = new Hibernate5Module(); // or Hibernate4Module ... depends on hibernate version you are using
    
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
    
        converters.add(new MappingJackson2HttpMessageConverter(mapper));
    
    }
    

    【讨论】:

      【解决方案3】:

      通过创建自己的 ObjectMapper,您将覆盖 Spring Boot 将设置的一个,其中将包括一堆有用的模块,例如 Jdk8 模块。

      你应该做的只是将 Hibernate5() 模块添加到应用程序上下文中,Spring Boot 会自动将它添加到它设置的 ObjectMapper 中。在任何@Configuration 类中都像这样:

      @Bean
      public Hibernate5Module hibernate5Module() {
          return new Hibernate5Module();
      }
      

      【讨论】:

        猜你喜欢
        • 2017-08-12
        • 2016-11-19
        • 2017-02-20
        • 2014-11-02
        • 2014-04-06
        • 2018-04-17
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        相关资源
        最近更新 更多