【问题标题】:How to obtain Jackson Object Mapper in Spring Rest mvc 5?如何在 Spring Rest mvc 5 中获取 Jackson 对象映射器?
【发布时间】:2018-12-07 13:27:28
【问题描述】:

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

我尝试了this question 中提出的解决方案,但没有一个奏效:我没有使用 Spring Boot,ObjectMapperMappingJackson2HttpMessageConverter 都不能是 @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 仍然具有该字段。

【问题讨论】:

    标签: java spring jackson


    【解决方案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);
            }
        }
    
    }
    

    【讨论】:

    • (ObjectMapper) ctx.getBean("jacksonMapper")
    • @AgostonHorvath(我是 Spring 新手)在我编写这段代码时,自动装配曾经保持为空,所以我选择了它 - 我现在做了一个快速尝试,但它似乎成功了自动接线。
    • @AgostonHorvath 我发现@Autowiring 不起作用的地方:使用给定的WebappConfig 类代码,该bean 不能注入SmartLifecycle 实现实例成员(尽管它只是在其start() 方法中使用),您有什么建议吗?
    猜你喜欢
    • 2015-12-23
    • 2014-09-18
    • 2012-01-19
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多