【问题标题】:Date is getting converted to Long while making a rest call using spring使用弹簧进行休息时,日期被转换为长
【发布时间】:2019-04-04 07:47:58
【问题描述】:

我在对象数组中传递一个日期参数作为请求参数,同时使用RestTemplate 向我的弹簧容器进行休息调用。

代码如下:

HttpEntity<SimplePipeServiceRequest> request = new HttpEntity<>(new Object[]{new Date(), 1}, headers);
response = template.postForEntity(uri1, request, String.class);

当请求到达我的服务器时,我会收到尽可能长的日期。我怎样才能得到日期作为日期?为什么来的这么久?

下面是我的 dispatcher-servlet.xml

<context:component-scan base-package="com.altra.aligne.controller"></context:component-scan>

<mvc:annotation-driven conversion-service="conversionService">
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="com.altra.middleware.spring.CustomObjectMapper"></bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<!-- RequestMappingHandlerMapping.setUseSuffixPatternMatch(boolean useSuffixPatternMatch) = Whether to use suffix pattern match (".*") 
when matching patterns to requests. -->
<bean class="com.altra.middleware.spring.ControllerBeanPostProcessor" />

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  <property name="converters">
    <list>
        <bean class="com.altra.middleware.spring.GenericDTOConverter"/>
        <bean class="com.altra.middleware.spring.StringToDateConverter"/>
    </list>
  </property>
</bean>

接下来是 dispatcher-servlet.xml,我从中进行其余调用

<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- 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. -->

        <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"/>
        <!-- atom feed requires com.sun.syndication package ...   -->
        <!--<bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/>-->
        <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.xml.Jaxb2CollectionHttpMessageConverter"/>
        <!-- marshalling converter requires spring oxm -->
        <!--<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"/>-->
    </mvc:message-converters>
</mvc:annotation-driven>

谁能解释日期在哪里以及如何转换为 long ,如果我想避免它,我可以实现它,如果我可以从 long 再次获得等效的日期?

我不熟悉 jackson 与 spring 的实际工作方式。

编辑

HttpEntity<SimplePipeServiceRequest> request = new HttpEntity<>(AbstractGasService.createSimpleServiceRequest(serviceRequestDTO), headers);
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("GasOpsModule");
module.addSerializer(Date.class, new DateSerializer());
module.addSerializer(Object[].class, new ObjectArraySerializer());
module.addSerializer(String.class, new StringSerializer());
mapper.registerModule(module);
MappingJackson2HttpMessageConverter dateConverter = new MappingJackson2HttpMessageConverter();
dateConverter.setObjectMapper(mapper);
if(!template.getMessageConverters().contains(dateConverter)) {
  template.getMessageConverters().add(dateConverter);
}
response = template.postForEntity(uri1, request, String.class);

不过,执行 post 时,两个序列化程序都不会被调用。

谢谢!

【问题讨论】:

    标签: spring jackson spring-rest


    【解决方案1】:

    您需要自定义ObjectMapper

    ObjectMapper mapper = new ObjectMapper();
    mapper.setDateFormat(DateFormat.getDateInstance());
    mapper.setTimeZone(TimeZone.getTimeZone("UTC"));
    

    但如果可以的话,使用Java 8 Time 包会更安全。

    欲了解更多信息,请查看:

    【讨论】:

    • 有什么方法可以指示RestTemplate 不将date 转换为long,因为它在将参数转换为对象数组时会转换为long。
    • 您能否粘贴您发送到 RestTemplate 的 Bean 类(已声明 Date 变量的位置)、请求和响应?
    • @Adithya,您可以覆盖RestTemplate 使用的消息转换器。看到这个问题:Jackson - Deserializing JSON to class。或者使用正确的消息转换器定义RestTemplate 是如何在Spring 上下文中创建的。
    • 我可以为RestTemplate 创建一个只考虑date 的消息转换器吗?
    • @Adithya,我不确定date 是什么意思? Date 类或date 部分采用date-time 格式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多