如何在Spring Rest MVC 5中获取Jackson对象映射器?

时间:2018-06-28 12:44:50

标签: java spring jackson

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

我已经尝试过this question中提出的解决方案,但是没有用:我没有使用Spring Boot,并且ObjectMapperMappingJackson2HttpMessageConverter都不是@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仍然具有该字段。

1 个答案:

答案 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);
        }
    }

}