java - 如何在 Spring Rest mvc 5 中获取 Jackson 对象映射器?
问题描述
我想获得ObjectMapper
Spring 5 创建、配置和使用的(或映射器)来序列化和反序列化我的 Rest 资源上的数据交换(即在其上调用readerForUpdating()或提供进一步的配置,例如添加 mixins)。
我已经尝试过这个问题中提出的解决方案,但没有一个奏效:我没有使用 Spring Boot,也没有 ofObjectMapper
或MappingJackson2HttpMessageConverter
can be @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);
}
}
}
推荐阅读
- php - 在 PHP 中导出时在 Excel 工作表中获取 HTML 表格代码
- reactjs - 使用 REST API 获取 ReactJS 的价值
- json - 根据另一个值从 JSON 中提取值
- python-3.x - 树莓派 Blynk LED 无响应
- javascript - 如何将所有下划线替换为角度空格?
- android - Android - 运行应用程序时生成失败错误
- c# - 是否可以向 Rx.Net Timeout 运算符添加自定义消息
- html - 如何让链接在导航菜单的整个高度上可点击
- java - 在 Android Kotlin 中重新访问应用程序后快速加载启动画面
- python - 如何使图像居中 matplotlib