Spring 3.1 JSON формат даты - PullRequest
       18

Spring 3.1 JSON формат даты

31 голосов
/ 27 января 2012

Я использую аннотированный MVC-код Spring 3.1 (spring-mvc), и когда я отправляю объект date через @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

. Как мне сделать так, чтобы дата отображалась в формате, который я зарегистрировал для веббиндера?На каком-то форуме я видел, что мне следует использовать картограф Джексона, но не могу ли я изменить существующий картограф?

Ответы [ 3 ]

48 голосов
/ 28 января 2012

Чтобы переопределить стратегию форматирования даты по умолчанию Jakson, необходимо выполнить следующие шаги:

  1. Расширить JsonSerializer, чтобы создать новый класс для обработки форматирования даты
  2. Переопределитьserialize(Date date, JsonGenerator gen, SerializerProvider provider) функция для форматирования даты в желаемом формате и записи ее обратно в экземпляр генератора (gen)
  3. Аннотируйте объект получения даты, чтобы использовать расширенный сериализатор 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

16 голосов
/ 05 октября 2012

В качестве альтернативы, если вы используете Джексона и хотите использовать дату ISO-8601 для всех дат (не только для тех, которые вы аннотируете), вы можете отключить запись по умолчанию дат в качестве временных отметок.Если вы хотите преобразовать даты в другой формат, отличный от формата по умолчанию, вы можете сделать это:

<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>
5 голосов
/ 01 октября 2014

Вот более стандартный способ настроить это, используя даты 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>

Вот дополнительная документация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...