Как получить Jackson Object Mapper в Spring Rest mvc 5? - PullRequest
0 голосов
/ 28 июня 2018

Я хочу получить ObjectMapper (или средства отображения), которые Spring 5 создает, настраивает и использует для сериализации и десериализации обмена данными на моих ресурсах Rest (т.е. для вызова readerForUpdating () для него или для обеспечить дальнейшую настройку, такую ​​как добавление миксинов).

Я пробовал решения, предложенные в этом вопросе , но ни один из них не сработал: я не использую Spring Boot, и ни один из ObjectMapper или MappingJackson2HttpMessageConverter не может быть @Autowired.

В частности, я попытался перенастроить ObjectMapper из MappingJackson2HttpMessageConverter:

@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);
            }
        }
        //...
    }
}

Но это тоже не работает, так как этот миксин удаляет поле из сериализованного объекта, но у созданного JSON все еще есть это поле.

1 Ответ

0 голосов
/ 05 сентября 2018

Вот мое решение: в основном, во время инициализации веб-приложения я получаю ссылку на преобразователь внутри соответствующего конвертера сообщений Spring, затем я сохраняю эту ссылку для последующего извлечения в виде компонента из контекста.

Это класс конфигурации 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();
            }
        }
    }

}

А вот пример использования этого Object Mapper:

@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);
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...