我有一个相当古老的Java 8 / Spring应用程序,它提供了一个REST API。响应以JSON或XML发送,具体取决于Accept Header。
所以例如
该应用程序现在在Spring 5中,但最初是在Spring3中,并且此方面从未转换为使用代码配置。
所以核心配置XML就是这个
self._log
控制器具有沿这些行设置的products属性
<!-- 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>
JSON处理程序的主要覆盖类是沿着这些行......
@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) { ...
所以设置场景。 XML版本运行良好。
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");
...
基本配置似乎适用于JSON消息处理程序,就好像我在头部中放置了一个配置的Mime类型它返回一个JSON文档但是如果我放置一个不存在的版本它会抛出错误。
但是,永远不会调用writeInternal方法,因此永远不会达到任何版本更改代码。我从几个角度看了这个,但我无法解决原因。笨拙的Init 1,init2打印语句输出到控制台。我确定它曾经工作但我现在看不出有什么不同,因为它在Spring中都是有线的我不确定如何进行调查,而不是查看代码中的错误!
如果有人知道这个问题可能是多么奇妙,那么目前虽然我不确定如何&amp;在哪里调查a)代码肯定用于工作和b)我不能在配置中看到任何错误的变化。我想知道这是否是我当时没有注意到的依赖关系的变化?