首页 > 解决方案 > 使用弹簧进行休息通话时,日期被转换为长

问题描述

我在对象数组中传递一个日期参数作为请求参数,同时使用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>

以下是调度程序-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 中再次获得等效的日期?

我不熟悉杰克逊实际上是如何与弹簧一起工作的。

编辑

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);

尽管如此,执行帖子时都不会调用任何序列化程序。

谢谢 !

标签: springjacksonspring-rest

解决方案


您需要自定义ObjectMapper

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

但是如果可以的话,使用 package.json 会更安全Java 8 Time

有关更多信息,请查看:


推荐阅读