配置 Jackson 以在 Spring Boot 中忽略延迟加载属性
Configure Jackson to omit lazy-loading attributes in Spring Boot
在spring boot mvc project with pure java配置如何配置Jackson省略延迟加载属性
如果您正在使用 SpringBoot,理想情况下您应该已经拥有 Hibernate4Module。
否则添加此依赖项
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
<version>2.5.3</version>
</dependency>
接下来创建一个名为 "HibernateAwareObjectMapper" 的 class 或您想要的任何名称:
内容如下:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
registerModule(new Hibernate4Module());
}
}
对于不同版本的 Hibernate,请参考这些 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。为此,创建一个 Config class extends extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter。 (如果您已经有一个,请执行下一步)。
现在使用 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);
}
中提琴!!!这应该足够了。
这是针对 spring 引导 Web 应用程序执行此操作的纯 java(无 xml)方式。
如果您想添加到答案中,请随时发表评论。
对我来说,实现此目的的最简单方法是扩展 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 配置的默认转换器。
使用最新版本的 Spring 引导,这要容易得多。
Any beans of type com.fasterxml.jackson.databind.Module will be automatically registered with the auto-configured Jackson2ObjectMapperBuilder and applied to any ObjectMapper instances that it creates. This provides a global mechanism for contributing custom modules when you add new features to your application.
74.3 Customize the Jackson ObjectMapper
首先确保您具有所需的 Jackson 依赖项:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>
然后您可以将该模块作为 @Bean
包含在应用程序上下文中。
@Bean
public Module hibernate4Module()
{
return new Hibernate4Module();
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jsonConverter.getObjectMapper();
objectMapper.registerModule(new Hibernate5Module());
return jsonConverter;
}
@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.
}
}
}
}
我使用 springboot 和 hibernamte5。0.x。
有效!
1. pom.xml
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.8.4</version>
</dependency>
2。网络配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
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.
}
}
}
}
在spring boot mvc project with pure java配置如何配置Jackson省略延迟加载属性
如果您正在使用 SpringBoot,理想情况下您应该已经拥有 Hibernate4Module。 否则添加此依赖项
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
<version>2.5.3</version>
</dependency>
接下来创建一个名为 "HibernateAwareObjectMapper" 的 class 或您想要的任何名称:
内容如下:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
registerModule(new Hibernate4Module());
}
}
对于不同版本的 Hibernate,请参考这些 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。为此,创建一个 Config class extends extends WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter。 (如果您已经有一个,请执行下一步)。
现在使用 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);
}
中提琴!!!这应该足够了。 这是针对 spring 引导 Web 应用程序执行此操作的纯 java(无 xml)方式。
如果您想添加到答案中,请随时发表评论。
对我来说,实现此目的的最简单方法是扩展 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 配置的默认转换器。
使用最新版本的 Spring 引导,这要容易得多。
Any beans of type com.fasterxml.jackson.databind.Module will be automatically registered with the auto-configured Jackson2ObjectMapperBuilder and applied to any ObjectMapper instances that it creates. This provides a global mechanism for contributing custom modules when you add new features to your application.
74.3 Customize the Jackson ObjectMapper
首先确保您具有所需的 Jackson 依赖项:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>
然后您可以将该模块作为 @Bean
包含在应用程序上下文中。
@Bean
public Module hibernate4Module()
{
return new Hibernate4Module();
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jsonConverter.getObjectMapper();
objectMapper.registerModule(new Hibernate5Module());
return jsonConverter;
}
@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.
}
}
}
}
我使用 springboot 和 hibernamte5。0.x。 有效!
1. pom.xml
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.8.4</version>
</dependency>
2。网络配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
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.
}
}
}
}