【问题标题】:Spring MVC jackson message converter date format is not working, always return long timestampSpring MVC jackson 消息转换器日期格式不起作用,总是返回长时间戳
【发布时间】:2017-06-08 03:09:59
【问题描述】:

我找到了这两个:

Jackson Object Mapper in spring MVC not working

why is the Object Mapper date fromat not used by message converters for date transform?

但没有一个对我来说是解决方案。

Spring MVC xml:

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="false">
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
          <property name="objectMapper">
             <bean class="com.xxx.model.MyJacksonObjectMapper">

             </bean>
          </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

MyJacksonObjectMapper:

public class MyJacksonObjectMapper extends ObjectMapper {

    private static final long serialVersionUID = -3282890427623599460L;

    public MyJacksonObjectMapper() {
        super();
        disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));          
    }

}

无论我将register-defaults 更改为true 还是false,它仍然无法正常工作,我的控制器总是以时间戳(长)格式序列化对象的日期值。

我的 POJO 对象没有附加任何注释,它是普通 POJO,我不能用任何注释(不是我的类)对其进行注释,我相信必须有配置允许以所需格式序列化默认对象的日期,但它是不工作,请帮忙。

依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.7.3</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.5.RELEASE</version>
</dependency>

【问题讨论】:

    标签: spring spring-mvc jackson


    【解决方案1】:

    好的,这个答案https://stackoverflow.com/a/7714503/1542363间接救了我,虽然我不知道为什么。

    它提到应该删除它:

    <mvc:annotation-driven/>
    

    我的问题与此类似,我在 Spring config XML 中复制了注释块:

    所以我改变了我的配置:

    <mvc:annotation-driven>
      <mvc:argument-resolvers>
        <bean class="org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver" />
      </mvc:argument-resolvers>
    </mvc:annotation-driven>
    
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="false">
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
              <property name="objectMapper">
                 <bean class="com.xxx.model.MyJacksonObjectMapper">
    
                 </bean>
              </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    

    到:

    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver" />
        </mvc:argument-resolvers>
        <mvc:message-converters register-defaults="false">
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
              <property name="objectMapper">
                 <bean class="com.xxx.model.MyJacksonObjectMapper"></bean>
              </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    

    然后就可以了,不知道是什么原因。

    【讨论】:

      【解决方案2】:

      我有同样的问题,但不想编写自定义对象映射器。我在 www.armedia.com 上找到了一篇文章,它展示了如何在不编写自定义映射器的情况下进行配置。使用 Spring 4.3.14 和 Jackson 2.9.2,以下 xml 配置对我有用。我相信它应该适用于 Spring 和 Jackson 的早期版本。

      <!-- set JSON date format to ISO-8601 e.g. 1970-01-01T00:00:00.000+0000 -->
      <bean id="sourceObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" />
      <bean id="acmObjectMapper"
          class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
          <property name="targetObject" ref="sourceObjectMapper" />
          <property name="targetMethod" value="disable" />
          <property name="arguments" value="WRITE_DATES_AS_TIMESTAMPS" />
      </bean>
      <bean id="acmJacksonConverter"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
          <property name="objectMapper" ref="acmObjectMapper" />
      </bean>
      
      <!-- We configure the Jackson mapper to output dates in ISO801 format. This requires adding 
           our customized Jackson mapper to the list of Spring MVC message converters. But, if 
           we just add our bean here all by itself, it will handle requests it should not handle,  
           e.g. encoding strings.  So we need to add the other standard message converters here 
           too, and make sure to put the customized Jackson converter AFTER the string converter. 
      -->
      <mvc:annotation-driven>
          <mvc:message-converters>
              <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
              <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
              <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
              <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
              <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
              <ref bean="acmJacksonConverter"/>
              <bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
              <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
              <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
              <bean class="org.springframework.http.converter.xml.Jaxb2CollectionHttpMessageConverter"/>
          </mvc:message-converters>
      </mvc:annotation-driven>
      

      所有功劳应归于 dmiller,地址为: https://www.armedia.com/blog/spring-mvc-setting-json-date-format-2/

      【讨论】:

        【解决方案3】:

        也许您的 xml 配置文件中有 2 个标签,例如:

        <mvc:message-converters register-defaults="false">
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
              <property name="objectMapper">
                 <bean class="com.xxx.model.MyJacksonObjectMapper">
        
                 </bean>
              </property>
            </bean>
        </mvc:message-converters>
        

        ..... ...... .....

        <mvc:annotation-driven/>
        

        我猜最后一个标签会覆盖第一个标签,所以你的 MyJacksonObjectMapper 类不会生效。

        【讨论】:

          猜你喜欢
          • 2019-08-10
          • 1970-01-01
          • 1970-01-01
          • 2013-08-08
          • 2011-10-10
          • 2016-11-26
          • 2016-11-14
          • 1970-01-01
          • 2022-12-03
          相关资源
          最近更新 更多