2012-09-11 12 views
5

Estoy usando el validador de Hibernate como @NotEmpty para ver si una propiedad específica en una clase está vacía o no. La clase es como se muestra:Hibernate Validator: Usando if - else tipo de lógica en la anotación

@Entity 
@Table(name="emergency_messages") 
public class EmergencyMessages implements Serializable { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="id", nullable=false) 
private Integer id; 

@NotEmpty(message="Home message cannot be empty") 
@Column(name="home_page_message") 
private String homePageMessage; 

@Range(min=0, max=1, message="Please select one of the display announcement value") 
@Column(name="messages_enabled") 
private Integer messagesEnabled; 
} 

Hasta ahora todo bien. Cuando la propiedad "homePageMessage" está vacía, puedo ver que el mensaje de error correcto aparece en el formulario del navegador.

Ahora la situación ha cambiado. El nuevo requisito es que la propiedad "homePageMessage" solo puede estar vacía si la otra propiedad "messagesEnabled" está configurada en 1. Si está configurada en 0, no debe haber ninguna comprobación vacía para "homePageMessage". En palabras simples, la validación de "homePageMessage" ahora debería depender del valor "messagesEnabled".

Mi pregunta: ¿Esto es posible con las anotaciones? De lo contrario, tendré que desmantelar mi mecanismo de validación de hibernación y crear mi propia clase de validación.

Respuesta

2

siguiente es el código que se me ocurrió (después de las sugerencias de Ajinkya y Alex):

anotación personalizada:

import java.lang.annotation.Documented; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.validation.Constraint; 
import javax.validation.Payload; 

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy=HomePageEmptyMessageValidator.class) 
public @interface HomePageEmptyMessage { 

String message() default ""; 

Class<?>[] groups() default {}; 

Class<? extends Payload>[] payload() default {}; 
} 

validador personalizado:

import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 

public class HomePageEmptyMessageValidator implements ConstraintValidator<HomePageEmptyMessage, EmergencyMessages> { 

@Override 
public void initialize(HomePageEmptyMessage homePageEmptyMessage) { 
} 

@Override 
public boolean isValid(EmergencyMessages emergencyMessages, ConstraintValidatorContext context) { 

    if (emergencyMessages == null) { 
     return false; 
    } 

    Integer messageEnabled = emergencyMessages.getMessagesEnabled(); 
    if (messageEnabled != null) { 
     if (messageEnabled == 1) { 
      String homePageMessage = emergencyMessages.getHomePageMessage(); 
      if (Util.isNullOrEmpty(homePageMessage)) { 
       return false; 
      } else { 
       return true; 
      } 
     } else { 
      return true; 
     } 
    } 

    return false; 
} 

} 

uso de la anotación personalizada en el código:

@Entity 
@Table(name="emergency_messages") 
@HomePageEmptyMessage(message="Home page annoucement cannot be empty if the Display Announcement is set to Yes") 
public class EmergencyMessages implements Serializable { 

private static final long serialVersionUID = -7870767517772161300L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="id", nullable=false) 
private Integer id; 

@Column(name="home_page_message") 
private String homePageMessage; 

@Range(min=0, max=1, message="Please select one of the display announcement value") 
@Column(name="messages_enabled") 
private Integer messagesEnabled; 
} 

Espero que ayude a alguien.

3

Creo que necesita escribir una anotación personalizada para lograr esto. También puede usar otra restricción de validación de hibernación con anotación personalizada, sin necesidad de eliminar nada.
Compruebe esto link para más detalles.

+0

Gracias por compartir el enlace. Fue útil. Trataré de escribir una anotación personalizada. – Raj

+0

Buenas cosas mi hombre. –

1

Lo que necesita es una implementación ConstraintValidator para su entidad, utilizando la anotación @Constraint en ella.

Aquí es donde pondrás condiciones en los campos que dependen de otros. Se supone que las restricciones que usan anotaciones en el campo se usan para verificar que se pueden hacer en el campo mismo y no depender de otras (como tamaño máximo, nulos, etc.).

+0

Gracias Alex. Usaré ConstraintValidator para escribir una anotación personalizada según lo sugerido. – Raj