Как использовать JodaTime с Spring и Hibernate? - PullRequest
8 голосов
/ 15 декабря 2011

Итак, я столкнулся с проблемой в моем приложении Spring. Пользователь может вводить даты с помощью инструмента выбора даты, и они хранятся в базе данных Mysql с помощью Hibernate. Таблица использует поле даты для их хранения, поэтому это не экономит время. Проблема в том, что сервер настроен на GMT, а наши пользователи - EST или GMT-5. Таким образом, дата правильно сохраняется в базе данных, но затем, когда она отображается во внешнем интерфейсе, она всегда показывает предыдущую дату. Раздражает меня, потому что я не экономлю время, но, очевидно, это все еще влияет на вещи. Во всяком случае, 10/10/2001 будет отображаться на переднем крае как 12/09/2011. Я посмотрел на это, и мне не разрешено менять сервер на EST, поэтому я сейчас пытаюсь решить эту проблему с помощью Jodatime (если у кого-то нет идеи, что я делаю что-то еще, чтобы вызвать это) или более простое решение .

Моя проблема в том, что я не могу найти никакой хорошей информации о том, как использовать Jodatime с Spring. В настоящее время я просто пытаюсь изменить один объект с использования java Date на использование joda LocalDate. Независимо от того, что я пытаюсь сделать, я получаю сообщения об ошибках «неверный заголовок потока» и «не могу десериализовать», когда он пытается извлечь объект даты из базы данных и вставить его в объект LocalDate.

Может ли кто-нибудь дать мне руководство о том, что мне нужно сделать для хранения и извлечения, чтобы это работало?

Я использую Spring 3.1 с аннотациями и всем этим хорошим материалом. Я рад предоставить код, но так как я не уверен, что с этим делать, у меня нет кода, который, на мой взгляд, был бы полезен. Я мог бы действительно использовать некоторую помощь в целом от JSP до базы данных и обратно. Я думаю, что главное, в чем я не уверен, это как хранить это на сервере, и я думаю, именно поэтому я получаю ошибки Hibernate. База данных использует дату, как я уже упоминал, поэтому не хранит время. Как я могу преобразовать LocalDate в это?

Вот некоторый код, если он помогает:

Доменный объект

@Entity
public class Provision {
    @Id @GeneratedValue
    private Long id;

    private LocalDate startDate;

    //Getters and setters
}

У меня есть DatePropertyEditor для преобразования текста в дату между JSP и Spring:

public class DatePropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String value) {
    try {
        setValue(new SimpleDateFormat("yyyy-MM-dd").parse(value));
    } catch (ParseException e) {
        setValue(null);
    }
}

@Override
public String getAsText() {
    if(getValue() != null)
        return new SimpleDateFormat("yyyy-MM-dd").format((Date) getValue());
    else
        return null;
}

}

А вот некоторые из JSP, куда вводятся данные:

<td align="right">Start Date:</td>
     <td><sf:input path="startDate" dojoType="dijit.form.DateTextBox" required="true" hasDownArrow="true" 
        onChange="dijit.byId('endDate').constraints.min = arguments[0];" constraints="{datePattern:'MMM d, y'}" />
</td>

Ни один из остальной части кода не имеет отношения к объектам Date и не касается их, все остальное обрабатывается посредством аннотаций и внедрения, а что нет.

Ответы [ 2 ]

7 голосов
/ 15 декабря 2011

Я бы посоветовал вам использовать Spring 3 Converter SPI вместо обычных PropertyEditors.

Тогда просто напишите собственный конвертер:

final class StringToDateTime implements Converter<String, DateTime> {
    private static final DateTimeFormatter FORMAT = // init here

    public DateTime convert(String source) {
        return FORMAT.parseDateTime(source);
    }

}

Но это только сторона Spring.Вы все еще должны убедиться, что Hibernate знает о JodaTime.Взгляните на проект Joda Time - Hibernate .

4 голосов
/ 21 февраля 2012

Эта проблема не нова, посмотрите на обсуждение, которое я разместил в своем блоге: http://blog.jadira.co.uk/blog/2010/5/1/javasqldate-types-and-the-offsetting-problem.html

Мой проект (Usertype - http://usertype.sourceforge.net/) решил эту проблему с помощью класса PersistentDateTime. Я бы предложил вам использовать это для предоставления типа пользователя для вашей сущности.

Javadoc в этом классе описывает, как вы можете настроить зону, которая используется для сохранения и последующей реинфляции: http://usertype.sourceforge.net/apidocs/org/jadira/usertype/dateandtime/joda/PersistentDateTime.html

Если вы используете Hibernate 4, вы также можете использовать авторегистрацию. Подробнее об использовании этой функции см. http://blog.jadira.co.uk/blog/2012/1/19/release-jadira-usertype-300cr1-with-support-for-joda-money-0.html

HTH

Chris

...