簡體   English   中英

如何在Spring Rest MVC 5中獲取Jackson對象映射器?

[英]How to obtain Jackson Object Mapper in Spring Rest mvc 5?

我想獲得Spring 5創建,配置和使用的ObjectMapper (或映射器),以對我的Rest資源上的數據交換進行序列化和反序列化(即在其上調用readerForUpdating()或提供進一步的配置,例如添加mixins)。

我已經嘗試過在此問題中提出的解決方案,但是沒有用:我沒有使用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仍然具有該字段。

這是我的解決方案:基本上,在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM