Контроллеры Spring-roo REST JSON изменяют поля даты - PullRequest
4 голосов
/ 29 ноября 2011

У меня есть объект данных, который я использую двумя способами: при загрузке страницы я заполняю таблицу некоторыми ее данными, а когда вы щелкаете по строке этого столбца, я AJAX собираю детали этого элемента и отображаю ихв полях формы.Я использую сгенерированные Spring-Roo конечные точки REST на стороне сервера и Backbone.js на клиенте.

Когда таблица загружается, поля даты имеют ожидаемый формат, выходящий прямо из моей базы данных MySQL ("гггг-ММ-дд").Когда я получаю свои данные AJAX, поля даты приходят ко мне как значения времени Unix (например, «1323666000000»).

Я могу преобразовать это на стороне клиента, но это глупо.Есть идеи, как заставить мой контроллер json этого не делать?

Я пытался вставить эти поля в свой файл .java и связался с аннотацией @DateTimeFormat, но не вижу, что это имеет какое-то значение.

1 Ответ

4 голосов
/ 12 декабря 2011

Вы можете преобразовать дату в любой формат, который вы хотите использовать для ответа JSON.

В вашем случае вы все время использовали преобразователь даты JSON по умолчанию для полей типа java.util.Date.Это в основном то, что генерируется для вас Spring Roo.Взгляните и в ваших аспектах * _Roo_Json, и вы найдете что-то.как это:

public java.lang.String PizzaOrder.toJson() {
    return new JSONSerializer().exclude("*.class").serialize(this);
}

Такая реализация использует класс flexjson.transformer.BasicDateTransformer для преобразования даты для вас.Он реализован следующим образом:

public class BasicDateTransformer extends AbstractTransformer {
    public void transform(Object object) {
        getContext().write(String.valueOf(((Date) object).getTime()));
    }
}

Вам нужно использовать другой, более мощный трансформатор.К счастью, он поставляется с вашим ру и называется flexjson.transformer.DateTransformer.Теперь, чтобы правильно отформатировать даты, просто замените значение по умолчанию на новый трансформатор, например, так:

public java.lang.String PizzaOrder.toJson() {
    return new JSONSerializer().exclude("*.class")
             .transform(new DateTransformer("MM/dd/yyyy"), Date.class)
             .serialize(this);
}

Вот и все: -)

Знайте, что вы также можете применять разные Date (и не только) преобразований для различных полей, таких как:

transform(new DateTransformer("MM/dd/yyyy"), "person.birthday")

Для получения дополнительной информации о flexjson посмотрите на страницу проекта FLEXJSON .

...