Spring MappingJackson2HttpMessageConverter没有被触发?

时间:2018-05-21 16:35:59

标签: java spring message-handlers

我有一个相当古老的Java 8 / Spring应用程序,它提供了一个REST API。响应以JSON或XML发送,具体取决于Accept Header。

所以例如

  • application / json-v1将响应转换为版本1的JSON 响应对象
  • application / json-v2 - 将响应转换为JSON 版本1的响应对象
  • application / xml-v1 - 转换 响应响应对象的版本1的XML

该应用程序现在在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)我不能在配置中看到任何错误的变化。我想知道这是否是我当时没有注意到的依赖关系的变化?

0 个答案:

没有答案