2015-11-16 32 views

回答

3

。 否则添加这种依赖性

<dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-hibernate4</artifactId> 
     <version>2.5.3</version> 
    </dependency> 

下创建一个名为“HibernateAwareObjectMapper”或任何你想将它命名类:

有以下内容:

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module; 

    public class HibernateAwareObjectMapper extends ObjectMapper { 

     public HibernateAwareObjectMapper() { 
      registerModule(new Hibernate4Module()); 
     } 
    } 

不同版本的Hibernate,请参考到这些休眠模块:

// for Hibernate 4.x: 
mapper.registerModule(new Hibernate4Module()); 
// or, for Hibernate 5.x 
mapper.registerModule(new Hibernate5Module()); 
// or, for Hibernate 3.6 
mapper.registerModule(new Hibernate3Module()); 

现在您需要通过消息转换器注册您的HibernateAwareObjectMapper。为此,创建一个扩展扩展WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter的Config类。 (如果你已经有一个只是按照下一步)。

现在使用HibernateObjectMapper注册的MessageConverter:

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){ 
    List<MediaType> supportedMediaTypes=new ArrayList<>(); 
    supportedMediaTypes.add(MediaType.APPLICATION_JSON); 
    supportedMediaTypes.add(MediaType.TEXT_PLAIN); 
    MappingJackson2HttpMessageConverter converter=new MappingJackson2HttpMessageConverter(); 
    converter.setObjectMapper(new HibernateAwareObjectMapper()); 
    converter.setPrettyPrint(true); 
    converter.setSupportedMediaTypes(supportedMediaTypes); 
    converters.add(converter); 
    super.configureMessageConverters(converters); 
} 

中提琴!这应该够了。 这是一个纯java(no-xml)的方式来做这个春季启动web应用程序。

随意评论,如果你想添加到答案。

+0

只是1件小的事情....确保你延长org.springframework.web。 servlet.config.annotation.WebMvcConfigurerAdapter,而不是spring引导的。 – tomerz

1

对我来说,最简单的方法是扩展WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter并覆盖extendMessageConverters方法。里面我已经搜索了MappingJackson2HttpMessageConverter,只是注册了Jackson Hibernate模块。

@Configuration 
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class) 
public class CustomWebMvcAutoConfig extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter 
{ 
    @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 Hibernate4Module()); 
       // replace Hibernate4Module() with the proper class for your hibernate version. 
      } 
     } 
    } 
} 

这样你就不会失去Spring配置的所有默认转换器。

+0

谢谢@Grzegorz,你把我带出了一个2天的地狱!它对我来说非常合适。我在RestController域中,使用休眠5.由Spring,Hibernate Session和FetchType LAZY或EAGER完成的Json Jackson自动序列化现在以可以理解的方式工作。 N.B .:现在并不需要任何@JsonInclude(JsonInclude.Include.NON_ABSENT/NON_EMPTY/etc ..) –

5

使用最新版本的Spring Boot,这更容易。

类型com.fasterxml.jackson.databind.Module的任何豆将与自动配置Jackson2ObjectMapperBuilder被自动注册和施加到其创建任何ObjectMapper实例。这为您在向应用程序添加新功能时提供了一种全球机制,可以为自定义模块提供支持

74.3 Customize the Jackson ObjectMapper

首先确保您具有所需的杰克逊依赖性:

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate4</artifactId> 
</dependency> 

然后,您可以只包含模块作为应用程序上下文@Bean

@Bean 
public Module hibernate4Module() 
{ 
    return new Hibernate4Module(); 
} 
+0

你是一位有福的圣徒。直到我切换到这个配置方法:在这个应用程序不工作:O –

-1
@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 
    ObjectMapper objectMapper = jsonConverter.getObjectMapper(); 
    objectMapper.registerModule(new Hibernate5Module()); 


    return jsonConverter; 
} 
+0

添加到您的application.java。它会工作。 – tim

0

什么@Grzegorz写了非常适合我。只是在这里呈现他的解决方案,而他的自定义类:

编辑:我在RestController域

@Configuration 
public class CustomWebMvcAutoConfig 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()); 
       // replace Hibernate4Module() with the proper class for your hibernate version. 
      } 
     } 
    } 
}