2016-04-08 8 views
1

Ich versuche, eine benutzerdefinierte Beans-Validierung zu erstellen, aber aus irgendeinem Grund funktioniert es nicht. Kann mir jemand sagen, was das Problem ist?Die benutzerdefinierte Beans-Validierung funktioniert nicht

Meine Hauptklasse:

package validationtest; 

import java.text.ParseException; 

public class Main { 

    /** 
    * @param args the command line arguments 
    * @throws java.text.ParseException 
    * @throws java.lang.IllegalAccessException 
    */ 
    public static void main(String[] args) throws ParseException, IllegalArgumentException, IllegalAccessException { 
     Text msg = new Text(); 
     System.out.println(msg.getMessage(""));  
    } 

} 

class Text { 
    public String getMessage(@NotEmpty(message = "Field message") String msg) { 
     return msg; 
    } 
} 

Meine Validierung Schnittstelle

package validationtest; 

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; 

@Documented 
@Target({ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = NotEmptyImpl.class) 
public @interface NotEmpty { 

    String message() default ""; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default{}; 
} 

Meine Validierung implementieren

package validationtest; 

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

public class NotEmptyImpl implements ConstraintValidator<NotEmpty, String> { 

    @Override 
    public void initialize(NotEmpty annotation) { 
     throw new RuntimeException("The field is not empty: " + annotation.message()); 
    } 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
     if (value == null) { 
      return false; 
     } 
     return !"".equals(value); 
    } 

} 

Hinweis: Ich habe das Paket validation-api-1.1.0.Final .jar zum Klassenpfad.

+0

Sie installierten nur die API? Nicht der Impl? (z. B. Hibernate Validator) – BalusC

+0

Ich habe dem Klassenpfad alle Hibernate-Dateien hinzugefügt: hibernate-validator-5.2.4.Final –

+0

Beachten Sie, dass Java-Anmerkungen nur "Markierungen" sind: Sie werden nicht automatisch "ausgeführt" oder verhalten sich. Ein Framework oder Tool muss die Annotation lesen und dann das entsprechende Verhalten ausführen. In diesem Fall denke ich, dass Sie ein wenig über Hibernate-Validatoren lesen müssen, um zu verstehen, wie Sie den Validator programmatisch ausführen. – DavidS

Antwort

1

Sie müssen die Implementierung der Bean-Validierung hinzufügen, zum Beispiel - Hibernate Validator 5.0. Maven Abhängigkeit:

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

Dann brauchen Sie ValidatorFactory + Validator, und führen Sie Methode mit ExecutableValidator zu initialisieren:

public static void main(String[] args) throws NoSuchMethodException { 
    ValidatorFactory vf = Validation.buildDefaultValidatorFactory(); 
    Validator validator = vf.getValidator(); 

    Text msg = new Text(); 

    String inParam = ""; 

    Method method = Text.class.getMethod("getMessage", String.class); 
    ExecutableValidator methodValidator = validator. forExecutables(); 
    Set<ConstraintViolation<Text>> violations = 
     methodValidator.validateParameters(msg, method, new Object[]{inParam}); 
    if (violations.size() > 0) { 
     violations.forEach(v -> System.out.println(v.getMessage())); 
    } else { 
     //if ok - executing method 
     msg.getMessage(inParam); 
     //or if return value also need validation: 
     //violations = methodValidator.validateReturnValue(msg, method, msg.getMessage("")); 
     //violations.forEach(v -> System.out.println(v.getMessage())); 
    } 

    vf.close(); 
} 

Ausgang:

Field message 

P. S. Und kommentieren "neue werfen ..." in NotEmptyImpl

+0

Danke für die Antwort. Gibt es eine Möglichkeit, zu überprüfen, ob eine Zeichenfolge leer ist, wenn Sie die getMessage-Methode der Text-Klasse aufrufen? –

+0

@OMDOmbudsmanSolutions Sie können die interne Methode überprüfen und bei Bedarf eine Ausnahme auslösen, ohne Bean-Validierung. – Rustam

+0

Danke, beste Grüße! –

Verwandte Themen