我想获得Spring 5创建,配置和使用的ObjectMapper
(或映射器),以对我的Rest资源上的数据交换进行序列化和反序列化(即在其上调用readerForUpdating()或进一步提供)配置,例如添加混合)。
我已经尝试过this question中提出的解决方案,但是没有用:我没有使用Spring Boot,并且ObjectMapper
或MappingJackson2HttpMessageConverter
都不是@Autowired
。 / p>
特别是,我尝试从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仍然具有该字段。
答案 0 :(得分:-1)
这是我的解决方案:基本上,在webapp初始化期间,我在相关的Spring消息转换器中获取了对映射器的引用,然后将该引用存储为以后从上下文中作为Bean检索。
这是Spring webapp配置类:
@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);
}
}
}