2011-12-15 781 views
8

Así que me encuentro con un problema en mi aplicación Spring. El usuario puede ingresar fechas usando una herramienta para seleccionar fechas y estas se almacenan en una base de datos Mysql usando Hibernate. La tabla utiliza un campo de Fecha para almacenarlos por lo que no es tiempo de guardado. El problema es que el servidor está configurado en GMT y nuestros usuarios son EST o GMT-5. Entonces, la fecha se almacena correctamente en la base de datos, pero cuando se muestra en la interfaz siempre muestra la fecha anterior. Me molesta ya que no estoy ahorrando tiempo, pero obviamente todavía está afectando las cosas. De todos modos, el 12/10/2001 aparecería en la parte delantera como 12/09/2011. Lo investigué y no tengo permiso para cambiar el servidor a EST, así que ahora estoy buscando resolverlo con Jodatime (a menos que alguien tenga una idea de que estoy haciendo otra cosa para causar esto) o una solución más fácil. .¿Cómo usar JodaTime con Spring e Hibernate?

Mi problema es que no puedo encontrar ninguna buena información sobre cómo usar Jodatime con Spring. Actualmente solo intento cambiar un objeto de usar el Date de java a joda's LocalDate. Sin importar lo que intento, obtengo errores en "encabezado de flujo no válido" y "no se puede deserializar" cuando intenta extraer el objeto de fecha de la base de datos y meterlo en el objeto LocalDate.

¿Podría alguien proporcionarme una guía sobre lo que debo hacer para almacenar y recuperar para que esto funcione?

Estoy usando Spring 3.1 con anotaciones y todas esas cosas buenas. Me complace proporcionar el código, pero como no estoy seguro de qué hacer, realmente no tengo ningún código que pueda ser útil. Realmente podría usar algo de ayuda sobre todo, desde los JSP hasta la base de datos y viceversa. Creo que lo principal de lo que no estoy seguro es cómo almacenar esto en el servidor y creo que es por eso que estoy recibiendo errores de Hibernate. La base de datos está usando Fecha como mencioné, por lo que no almacena el tiempo. ¿Cómo convierto un LocalDate en esto?

Aquí hay un código si ayuda:

objetos de dominio de

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

    private LocalDate startDate; 

    //Getters and setters 
} 

Tengo un DatePropertyEditor para la conversión de texto a la fecha entre JSP y primavera:

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; 
} 

} 

Y aquí hay algunos de los JSP donde se ingresan los datos:

<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> 

Ninguno del resto del código trata o toca los objetos Fecha, el resto se maneja a través de anotaciones e inyecciones y lo que no.

+0

mente que nos muestra su código? – luastoned

Respuesta

7

Le sugiero que utilice el Spring 3 Converter SPI en lugar de los editores de propiedades normales.

Entonces acaba de escribir un convertidor personalizado:

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

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

} 

Pero eso es sólo el lado del muelle. Aún debe asegurarse de que Hibernate sepa sobre JodaTime. Eche un vistazo al proyecto Joda Time - Hibernate support para eso.

+0

Muy buena información, muchas gracias. – cardician

4

Este problema no es nuevo, echar un vistazo a la discusión de la misma que puse en mi blog: http://blog.jadira.co.uk/blog/2010/5/1/javasqldate-types-and-the-offsetting-problem.html

Mi proyecto (Definido por el usuario - http://usertype.sourceforge.net/) solucionado esto con su clase PersistentDateTime. Sugeriría que use esto para proporcionar un tipo de uso para su entidad.

El Javadoc en esta clase describe cómo se puede modificar aún más la zona que se utiliza para persistir y, posteriormente, volver a la inflación: http://usertype.sourceforge.net/apidocs/org/jadira/usertype/dateandtime/joda/PersistentDateTime.html

Si utiliza Hibernate 4 también se puede hacer uso de registro automático. Para más detalles sobre cómo utilizar esta función, ver http://blog.jadira.co.uk/blog/2012/1/19/release-jadira-usertype-300cr1-with-support-for-joda-money-0.html

HTH

Chris

+0

¿Cómo uso Usertype con Hibernate EntityManger? –

Cuestiones relacionadas