2012-09-11 6 views
5

Ich benutze Hibernate-Validator wie @NotEmpty, um zu sehen, ob eine bestimmte Eigenschaft in einer Klasse leer ist oder nicht. Die Klasse ist wie gezeigt:Hibernate Validator: Verwenden von if - sonst Art von Logik in Annotation

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

So weit so gut. Immer wenn die Eigenschaft "homePageMessage" leer ist, kann ich die korrekte Fehlermeldung im Formular im Browser sehen.

Jetzt hat sich die Situation geändert. Die neue Anforderung ist, dass die Eigenschaft "homePageMessage" nur dann leer sein kann, wenn die andere Eigenschaft "messagesEnabled" auf 1 gesetzt ist. Wenn sie auf 0 gesetzt ist, sollte für "homePageMessage" kein leerer Check durchgeführt werden. In einfachen Worten sollte die Validierung von "homePageMessage" nun vom Wert "messagesEnabled" abhängig sein.

Meine Frage: Ist das mit Annotationen möglich? Wenn nicht, dann muss ich meinen Hibernate-Validator-Mechanismus demontieren und meine eigene Validierungsklasse erstellen.

Antwort

2

Es folgt der Code, kam ich mit (nach Anregungen von Ajinkya und Alex):

Customized Annotation:

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

Customized Validator:

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

} 

Verwendung von kundenspezifischen Anmerkung im Code:

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

Ich hoffe es hilft jemandem.

3

Ich denke, Sie müssen benutzerdefinierte Annotation schreiben, um dies zu erreichen. Sie können auch eine andere Überprüfungsbeschränkung für den Ruhezustand mit einer benutzerdefinierten Anmerkung verwenden, ohne dass Sie etwas entfernen müssen.
Überprüfen Sie diese link für Details.

+0

Vielen Dank für den Link. Es war hilfreich. Ich werde versuchen, eine benutzerdefinierte Anmerkungen zu schreiben. – Raj

+0

Gute Sachen mein Mann. –

1

Was Sie brauchen, ist eine ConstraintValidator Implementierung für Ihre Entität, mit der @Constraint Annotation darauf.

Hier legen Sie Bedingungen für Felder fest, die von anderen abhängig sind. Constraints, die Annotationen für ein Feld verwenden, sollen für die Überprüfung verwendet werden, die auf dem Feld selbst vorgenommen werden kann und nicht von anderen abhängig ist (wie maximale Größe, Nullwert, usw.).

+0

Danke Alex. Ich werde ConstraintValidator verwenden, um eine benutzerdefinierte Annotation wie vorgeschlagen zu schreiben. – Raj