首页 > 解决方案 > 如何在 Spring Rest mvc 5 中获取 Jackson 对象映射器?

问题描述

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

我已经尝试过这个问题中提出的解决方案,但没有一个奏效:我没有使用 Spring Boot,也没有 ofObjectMapperMappingJackson2HttpMessageConvertercan 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 仍然具有该字段。

标签: javaspringjackson

解决方案


这是我的解决方案:基本上,在 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);
        }
    }

}

推荐阅读