如何在春休 mvc 5 中获取杰克逊对象映射器?



我想获取Spring 5创建,配置和用于序列化和反序列化Rest资源上数据交换的ObjectMapper(或映射器((即在其上调用readerForUpdating((或提供进一步的配置,例如添加mixins(。

我已经尝试了这个问题中提出的解决方案,但没有一个奏效:我没有使用 Spring Boot,ObjectMapperMappingJackson2HttpMessageConverter都无法@Autowired

特别是,我尝试从MappingJackson2HttpMessageConverter重新配置ObjectMapper:

@EnableWebMvc
@Configuration
@EnableSwagger2
@ComponentScan(basePackages=...)
public class WebappConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// ...
for(HttpMessageConverter<?> c : converters) {
if(c instanceof MappingJackson2HttpMessageConverter) {
ObjectMapper o = ((MappingJackson2HttpMessageConverter) c).getObjectMapper();
//o.configure(SerializationFeature.INDENT_OUTPUT, true);
o.addMixIn(WorkStamp.class, WorkStampApi.class);
}
}
//...
}
}

但这也不起作用,因为 mixin 从序列化对象中删除了一个字段,但生成的 JSON 仍然具有该字段。

这是我的解决方案:基本上,在 Web 应用程序初始化期间,我在相关的 Spring 消息转换器中获取对映射器的引用,然后存储该引用,以便稍后从上下文中作为 Bean 检索。

这是 Spring Web 应用程序配置类:

@EnableWebMvc
@Configuration
@EnableSwagger2
@ComponentScan(basePackages= { "..." })
@PropertySource("...")
public class WebappConfig implements WebMvcConfigurer {
private ObjectMapper jacksonMapper;
@Bean(name="jacksonMapper",autowire=Autowire.BY_NAME)
public ObjectMapper getMapper() {
return jacksonMapper;
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
Iterator<HttpMessageConverter<?>> it = converters.iterator();
while(it.hasNext()) {
HttpMessageConverter<?> conv = it.next();
if(conv instanceof MappingJackson2HttpMessageConverter) {
MappingJackson2HttpMessageConverter jacksonConverter = (MappingJackson2HttpMessageConverter) conv;
jacksonMapper = jacksonConverter.getObjectMapper();
}
}
}
}

下面是该对象映射器用法的示例:

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping(path="...")
public class Controller {
@Autowired
private ApplicationContext ctx;
@PostMapping(path= { "..." })
public ApiResponse<?> post() {
try {
// ...
ObjectMapper om = (ObjectMapper) ctx.getBean("jacksonMapper");
// ...
return new ApiResponse<>();
} catch (Exception e) {
throw new UnsupportedOperationException(e);
}
}
}

最新更新