Spring 3.1 Формат даты в формате JSON
Я использую аннотированный код Spring 3.1 MVC (spring -mvc), и когда я отправляю объект даты через @RequestBody, дата отображается как числовая.
Это мой контроллер
@Controller
@RequestMapping("/test")
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}
@RequestMapping(value = "/getdate", method = RequestMethod.GET)
public @ResponseBody Date getDate(@RequestParam("dt") Date dt, Model model) {
// dt is properly constructed here..
return new Date();
}
}
Когда я передаю дату, я могу получить дату в формате.
Но мой браузер отображает дату как числовую.
1327682374011
Как мне отображать дату в формате, который я зарегистрировал для веб-сайта?
Я видел в каком-то форуме, что я должен использовать джектор-картограф, но не могу ли изменить существующий картограф?
Ответы
Ответ 1
Чтобы переопределить стратегию форматирования даты по умолчанию для Jakson, выполните следующие шаги:
- Расширить
JsonSerializer
, чтобы создать новый класс для обработки форматирования даты.
- Переопределить функцию
serialize(Date date, JsonGenerator gen, SerializerProvider provider)
для форматирования даты в нужном формате и записать ее обратно в экземпляр генератора (gen)
- Аннотировать объект getter для даты использования расширенного json-сериализатора с помощью
@JsonSerialize(using = CustomDateSerializer.class)
код:
//CustomDateSerializer class
public class CustomDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) throws
IOException, JsonProcessingException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(value);
gen.writeString(formattedDate);
}
}
//date getter method
@JsonSerialize(using = CustomDateSerializer.class)
public Date getDate() {
return date;
}
Источник: http://blog.seyfi.net/2010/03/how-to-control-date-formatting-when.html
Ответ 2
В качестве альтернативы, если вы используете jackson и хотите иметь дату ISO-8601 во всех датах (а не только те, которые вы комментируете), вы можете отключить по умолчанию запись дат в качестве временных меток.
<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>
<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" />
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="jacksonSerializationConfig" />
<property name="targetMethod" value="disable" />
<property name="arguments">
<list>
<value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_DATES_AS_TIMESTAMPS</value>
</list>
</property>
</bean>
Затем, если вы хотите преобразовать свои даты в другой формат, чем по умолчанию, вы можете сделать это:
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="jacksonSerializationConfig" />
<property name="targetMethod" value="setDateFormat" />
<property name="arguments">
<list>
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd'T'HH:mm:ssZ"/>
</bean>
</list>
</property>
</bean>
Ответ 3
Вот более стандартный способ настроить это, используя даты ISO8601, что я бы рекомендовал для вашего API.
<!-- you can't call it objectMapper for some reason -->
<bean name="jacksonObjectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="featuresToDisable">
<array>
<util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS"/>
</array>
</property>
</bean>
<!-- setup spring MVC -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
Вот дополнительная документация: