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 Comentarios

  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.

Dejar respuesta

Please enter your comment!
Please enter your name here