У меня довольно старое приложение Java 8 / Spring, которое предоставляет REST API.Ответ отправляется в формате JSON или XML в зависимости от заголовка Accept.
Так, например,
- application / json-v1 преобразует ответ в JSON версии 1 объекта ответа
- application / json-v2 - преобразует ответ в JSON версии 1 объекта ответа
- application / xml-v1 - преобразует ответ в XML версии 1 объекта ответа
Приложение сейчас в Spring 5, но изначально было в Spring3, и этот аспект никогда не конвертировался в конфигурацию кода.
Таким образом, XML-файл конфигурации ядра имеет такой
<!-- Enables the Spring MVC @Controller programming model, and set converters in use -->
<mvc:annotation-driven>
<message-converters>
<beans:bean class="com.packagpath.AppJaxb2RootElementHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:bean class="org.springframework.http.MediaType">
<beans:constructor-arg index="0" value="application"/>
<beans:constructor-arg index="1" value="xml"/>
</beans:bean>
<beans:bean class="org.springframework.http.MediaType">
<beans:constructor-arg index="0" value="application"/>
<beans:constructor-arg index="1" value="xml-v1"/>
</beans:bean>
<beans:bean class="org.springframework.http.MediaType">
<beans:constructor-arg index="0" value="application"/>
<beans:constructor-arg index="1" value="xml-v2"/>
</beans:bean>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="com.packagpath.AppMappingJackson2HttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:bean class="org.springframework.http.MediaType">
<beans:constructor-arg index="0" value="application"/>
<beans:constructor-arg index="1" value="json"/>
</beans:bean>
<beans:bean class="org.springframework.http.MediaType">
<beans:constructor-arg index="0" value="application"/>
<beans:constructor-arg index="1" value="json-v1"/>
</beans:bean>
<beans:bean class="org.springframework.http.MediaType">
<beans:constructor-arg index="0" value="application"/>
<beans:constructor-arg index="1" value="json-v2"/>
</beans:bean>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
</message-converters>
</mvc:annotation-driven>
<beans:bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
</beans:bean>
Контроллеры имеют атрибуты продукции, установленные вдоль этих строк
@RequestMapping(method = RequestMethod.GET, value = AppController.RESOURCE_NAME + "/{id}", produces = {
XML_MIME_TYPE_DEFAULT, JSON_MIME_TYPE_DEFAULT, XML_MIME_TYPE_V1, JSON_MIME_TYPE_V1,
XML_MIME_TYPE_V2, JSON_MIME_TYPE_V2 })
@ResponseBody
public Person getAccount(@PathVariable(value = "id") String id, HttpServletRequest request) { ...
Основной класс переопределения для обработчика JSON находится вдоль этих линий ...
public class AppMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
private Utils utils = new Utils();
/**
* Init method must be called to ensure the object mapper used by this converter ignores null fields.
*/
@PostConstruct
public void init() {
System.out.println("init 1");
getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
System.out.println("init 2");
}
//
@Override
protected void writeInternal(Object responseObject, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
System.out.println("VersionConversion versionConversion");
...
Итак, установивсцена.Версия XML работает хорошо.
public class AppJaxb2RootElementHttpMessageConverter extends Jaxb2RootElementHttpMessageConverter {
private Utils utils = new Utils();
@Override
protected void writeToResult(Object responseObject, HttpHeaders headers, Result result) throws IOException {
VersionConversion versionConversion = AnnotationUtils.findAnnotation(responseObject.getClass(), VersionConversion.class);
...
Базовая конфигурация, кажется, работает для обработчика сообщений JSON, как будто я помещаю настроенный тип Mime в заголовок, он возвращает документ JSON, но если я помещаю несуществующую версию, он выдает ошибку.
Однако метод writeInternal никогда не вызывается, и поэтому любой код изменения версии никогда не будет достигнут.Я смотрел на это с нескольких сторон, и я не могу понять, почему.Неуклюжие операторы Init 1, init2 print получают вывод на консоль.Я уверен, что раньше это работало, но я не вижу, что сейчас отличается, и поскольку все это связано весной, я не уверен, как исследовать дальше, чем искать код на наличие ошибок!
Если кто-нибудь знает, в чем может быть проблема, это было бы фантастически, в настоящий момент, хотя я не уверен, как и где исследовать, как: а) определенно используемый код и б) я не вижучто-то не так в конфиге, которое изменилось.Мне интересно, если это изменение в зависимостях, которые я не заметил в то время?