Validación de una fecha con Hibernate

Existe un sistema de gestión hotelera. Me pidió que añadir una fecha de validación en el «Crear un Alojamiento» función en el sistema. El diálogo se parece a esto:

Validación de una fecha con Hibernate

La «Fecha Final» ya está validado como se muestra en el siguiente código. El @Future anotación en modo de Hibernación se asegura de que la fecha es en el futuro.

@NotNull
@Future
@DateTimeFormat(pattern = "dd/MM/yyyy")
@Temporal(TemporalType.DATE)
private Date endDate;

EDITAR

Me pidió que añadir una validación a la «fecha de Inicio». Sólo el presente, o en una fecha futura, está permitido. Traté de usar un @Present anotación, pero supongo que no hay tal cosa. Por desgracia, @Future no acepta la fecha de hoy. Soy nuevo en este tipo de cosas. Así que espero que alguien me pueda ayudar. Gracias.

  • ¿Qué clase/framework hace la anotación @Future vienen?
  • es hibernate creo
  • Si la fecha actual es el único valor válido, ¿por qué tiene el campo?
  • Tenga en cuenta que su formato (mm/dd/yyyy) y la anotación del formato (dd/MM/yyyy) no coinciden.
  • import javax.la validación.las limitaciones.Futuro;
  • lo siento, he editado mi pregunta Señor. Es para la corriente & fecha futura.

InformationsquelleAutor Kendall H. | 2016-11-08

3 Kommentare

  1. 8

    Hibernate

    Puede utilizar

    @CreationTimestamp
    @Temporal(TemporalType.DATE)
    @Column(name = "create_date")
    private Date startDate;

    o en la actualización de los

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "modify_date")
    private Date startDate;

    Java (JPA)

    Puede definir un campo Date startDate; y uso

    @PrePersist
    protected void onCreateStartDate() {
    startDate = new Date();

    o en la actualización de los

    @PreUpdate
    protected void onUpdateStartDate() {
    startDate = new Date();

    Actualización y ejemplo

    Después de haber actualizado su pregunta a la fijación de la fecha de inicio hasta el presente, tiene que hacer un enfoque diferente. Usted necesita escribir un validador personalizado para comprobar si una fecha es ahora o en el futuro, como aquí.

    Por lo tanto, usted puede introducir una nueva anotación en PresentOrFuture.java:

    @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = PresentOrFutureValidator.class)
    @Documented
    public @interface PresentOrFuture {
        String message() default "{PresentOrFuture.message}";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }

    Entonces usted tiene que definir el validador en PresentOrFutureValidator.java:

    public class PresentOrFutureValidator
        implements ConstraintValidator<PresentOrFuture, Date> {
    
        public final void initialize(final PresentOrFuture annotation) {}
    
        public final boolean isValid(final Date value,
            final ConstraintValidatorContext context) {
    
            //Only use the date for comparison
            Calendar calendar = Calendar.getInstance(); 
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
    
            Date today = calendar.getTime();
    
            //Your date must be after today or today (== not before today)
            return !value.before(today) || value.after(today);
    
        }
    }

    Poner:

    @NotNull
    @PresentOrFuture
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    @Temporal(TemporalType.DATE)
    private Date startDate;

    Bueno, eso fue exhausive. No he probado a mí mismo, ya que no tengo un set-up para hacerlo ahora, pero debería funcionar. Espero te sirva de ayuda.

    • Lo siento por la respuesta tardía Señor. Esto son los códigos para startDate: pastie.org/10958151 espero que usted me puede orientar. Gracias.
    • Si usted sólo puede permitir que la marca de tiempo actual, ¿por qué tienes un método setter? ¿El uso de Hibernate o JPA?
    • Lo siento, he editado mi pregunta Señor. Debería aceptar actual & fecha futura. Puedo usar el modo de hibernación.
    • Gracias por su ayuda, Señor! 🙂 Voy a probar esto y actualización. 🙂
    • He probado tu código de Sir. He creado un PresentOrFuture.java anotación y PresentOrFutureValidator.java clase y añadió @PresentOrFuture pero cuando trato de ejecutar el programa me sale este error: «La aplicación web [/hms] registrado el controlador JDBC [org.hsqldb.jdbc.JDBCDriver], pero no para anular el registro cuando la aplicación web fue detenido. Para evitar una pérdida de memoria, el Controlador JDBC ha sido objeto de no registrados.»
    • Sigue recibiendo el mismo error cuando lo ejecuto en el símbolo del sistema Sir. Esto es lo que sucede cuando «mvn tomcat7:ejecutar» es: pastie.org/private/cyemsdl01qerwy2dfvnpjw
    • ¿Tiene errores de compilación o advertencias de esta? Me han cambiado el destino de anotación para @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER }), yo no creo que este es el problema, pero se puede intentar. La versión de Java que se utilizan?
    • Yo no Sir. Yo lo intenté pero me sigue apareciendo el mismo error, Señor. Java 8.
    • Lamentablemente, no tengo el medio ambiente a prueba a mí mismo, pero desde el uso de Java 8, probablemente yo tengo otra solución para usted. El error ASM ClassReader failed to parse class file puede venir del uso de Java 8 en versiones antiguas de la Primavera, consulte here o here. Ahora, compilar el código con Java 7 o en el último actualizar a la Primavera 4. Actualización mí, Madame.
    • Lo siento Señor, yo estaba mal de la Versión de Java que estoy usando es la 1.6 y no 8. Otra solución que usted sugiere? Gracias por su paciencia, Señor.
    • Qué Primavera versión usas?
    • 3.2.8.La LIBERACIÓN de Sir.
    • Como ya se ha dicho here por ItayK, este puede ser un fallo sobre la MAPE en la Primavera de 3.2.8. Lo mejor que puedes hacer es actualizar a la Primavera 4.

  2. 5

    Ahora, en la actualización del nuevo validador de la versión de decir

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.4.Final</version>
    </dependency>

    a través de

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.0.Final</version>
    </dependency>

    tenemos @FutureOrPresent y muchas otras anotaciones útiles que puede utilizar.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea