2016-04-08 11 views
1

カスタムBean検証を作成しようとしていますが、何らかの理由でそれが機能していません。誰が問題を教えてくれますか?カスタムBeans検証が機能していません

私のメインクラス:

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

私の検証インタフェース

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

私の検証は

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

} 

注意を実装:私はパッケージvalidation-api-1.1.0.Finalを追加しました.jarをクラスパスに追加します。

+0

APIのみをインストールしましたか?インプラントではない? (例:Hibernate Validator) – BalusC

+0

クラスパスにすべてのHibernate jarを追加しました:hibernate-validator-5.2.4.Final –

+0

Java注釈は単に「マーカー」であることに注意してください。いくつかのフレームワークまたはツールは注釈を読み込み、適切な動作を実行する必要があります。この場合、プログラマチックにバリデーターを実行する方法を理解するためには、Hibernate Validatorsについて少し読む必要があると思います。 – DavidS

答えて

1

Bean検証の実装を追加する必要があります(例:Hibernate Validator 5.0)。 Mavenの依存関係:

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

次にあなたがValidatorFactory +バリデータを初期化し、ExecutableValidatorでメソッドを実行する必要があります。

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

出力:

Field message 

P.S. NotEmptyImplで「新しいものを投げてください」とコメントしてください

+0

答えをありがとう。 TextクラスのgetMessageメソッドを呼び出すときに文字列が空であるかどうかを確認する方法はありますか? –

+0

@OMDOmbudsmanSolutions Beanの検証なしで、内部メソッドをチェックして例外をスローすることができます。 – Rustam

+0

ありがとう、よろしく! –

関連する問題