[英]How to obtain Jackson Object Mapper in Spring Rest mvc 5?
我想獲得Spring 5創建,配置和使用的ObjectMapper
(或映射器),以對我的Rest資源上的數據交換進行序列化和反序列化(即在其上調用readerForUpdating()或提供進一步的配置,例如添加mixins)。
我已經嘗試過在此問題中提出的解決方案,但是沒有用:我沒有使用Spring Boot,並且ObjectMapper
或MappingJackson2HttpMessageConverter
都不能為@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仍然具有該字段。
這是我的解決方案:基本上,在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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.