为某些软件包Spring MVC设置一个不同的ObjectMapper [英] Set a different ObjectMapper for certain package Spring MVC
本文介绍了为某些软件包Spring MVC设置一个不同的ObjectMapper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有没有一种方法可以使用spring为我项目中的某些软件包设置HttpMessageConverter?
Is there a way to set a HttpMessageConverter for only certain packages in my project using spring?
@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = MyConfig.class)
public class MyConfig
extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJacksonHttpMessageConverter) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
objectMapper.setSerializationInclusion(Inclusion.NON_NULL);
((MappingJacksonHttpMessageConverter) converter).setObjectMapper(objectMapper);
}
}
}
使用此PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
,更改项目中的所有响应,我希望此方法仅适用于某些dto.
Using this PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
, changes all responses in project and I want this to apply only in some dto.
推荐答案
下面是hzpz提出的解决方案示例:
Here an example of the solution propose by hzpz :
自定义转换器:
public class CustomConverter extends MappingJackson2HttpMessageConverter {
private String basePackage;
public CustomConverter(String basePackage) {
this.basePackage = basePackage;
}
@Override
public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
if (contextClass.getName().startsWith(basePackage)) {
return super.canRead(type, contextClass, mediaType);
}
return false;
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
if (clazz.getName().startsWith(basePackage)) {
return super.canWrite(clazz, mediaType);
}
return false;
}
}
配置
@Configuration
public class CustomConfig {
@Bean
public MappingJackson2HttpMessageConverter firstConverter() {
MappingJackson2HttpMessageConverter converter = new CustomConverter("package.camel");
converter.setObjectMapper(firstObjectMapper());
return converter;
}
@Bean
public MappingJackson2HttpMessageConverter secondConverter() {
MappingJackson2HttpMessageConverter converter = new CustomConverter("package.snake");
converter.setObjectMapper(secondObjectMapper());
return converter;
}
@Bean
public ObjectMapper firstObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
return mapper;
}
@Bean
public ObjectMapper secondObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
return mapper;
}
}
这篇关于为某些软件包Spring MVC设置一个不同的ObjectMapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文