Reputation: 1473
I know, that here are plenty examples with JSON-date format on the client side from Spring MVC, but in my case everything works fine, except one specific case with composite contract.
The problem is that on the client side JSON response side in the curObj
the date currencyOpenedDate
received in the string format, at the same time in the depObj.subdivisionClosedDate
date is specified in the timestamp format.
Screen of the response you can find at the bottom of the question.
The question is how to receive curObj.currencyOpenedDate
in the timestamp format?
<context:component-scan base-package="ru.iteco.kursval.server.rest"/>
<context:annotation-config/>
<!-- Configures the @Controller programming model -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<!-- Total customization - see below for explanation. -->
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false"/>
<property name="favorParameter" value="true"/>
<property name="parameterName" value="mediaType"/>
<property name="ignoreAcceptHeader" value="true"/>
<property name="useJaf" value="false"/>
<property name="defaultContentType" value="application/json"/>
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
<entry key="xml" value="application/xml"/>
</map>
</property>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean:bean class="ru.iteco.kursval.server.rest.config.ApiInterceptor" autowire="constructor">
</bean:bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- Make this available across all of Spring MVC -->
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
public class RegionalBankBlockCurrencyDto implements Serializable {
//.....
private Long curId;
/*----> here */ private CurrencyDto curObj;
private Long depId;
private SubdivisionDto depObj;
// .... getters and setters
}
public class CurrencyDto implements Serializable {
private Date currencyOpenedDate;
private Date currencyClosedDate;
public Date getCurrencyOpenedDate() {
return currencyOpenedDate;
}
public void setCurrencyOpenedDate(Date currencyOpenedDate) {
this.currencyOpenedDate = currencyOpenedDate;
}
public Date getCurrencyClosedDate() {
return currencyClosedDate;
}
public void setCurrencyClosedDate(Date currencyClosedDate) {
this.currencyClosedDate = currencyClosedDate;
}
}
Currency and Subdivision DTOs are simple without any annotations and Date-properties initialization in both cases look like this:
Date openDate = null;
if (currency.getOpenDate() != null) {
openDate = new Date(currency.getOpenDate().getTime());
}
Upvotes: 1
Views: 4633
Reputation: 21923
Configure your Object Mapper as follows;
@Autowired
private ObjectMapper objectMapper;
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, true);
Upvotes: 2