2011-08-10 14 views

答えて

0

私はAOPの道を行くだろう:あなたはjavax.validation互換性のあるバリデータ(Hibernate Validatorは、リファレンス実装である)を必要とするすべての

まず。

Validatorインスタンスを持つaspectjアスペクトを作成し、すべてのメソッドパラメータで検証エラーをチェックします。

public aspect ValidationAspect { 

    private final Validator validator; 

    { 
     final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
     validator = factory.getValidator(); 

    } 

    pointcut serviceMethod() : execution(public * com.yourcompany**.*(..)); 

    before() : serviceMethod(){ 
     final Method method = (Method) thisJoinPoint.getTarget(); 
     for(final Object arg : thisJoinPoint.getArgs()){ 
      if(arg!=null) validateArg(arg,method); 
     } 
    } 

    private void validateArg(final Object arg, final Method method) { 
     final Set<ConstraintViolation<Object>> validationErrors = validator.validate(arg); 
     if(!validationErrors.isEmpty()){ 
      final StringBuilder sb = new StringBuilder(); 
      sb.append("Validation Errors in method ").append(method).append(":\n"); 
      for (final ConstraintViolation<Object> constraintViolation : validationErrors) { 
       sb.append(" - ").append(constraintViolation.getMessage()).append("\n"); 
      } 
      throw new RuntimeException(sb.toString()); 
     } 
    } 

} 

テストおよび/または製品コードにその側面を織りaspectj-maven-pluginを使用します。ここでは、始めるために迅速なバージョンがあります。

この機能のみをテストする場合は、aspectj-pluginの実行をプロファイルに入れます。

4

IDEAは、そのようなバリデーションを追加するために、バイトコードをインスツルメントする独自の方法を使用しています。コマンドラインビルドでは、instrumentationを行うjavac2 Antタスクを提供します(標準のjavacタスクを拡張します)。 IDEAからAntビルドを生成する場合、javac2を使用するオプションがあります。

We don't provide similar Maven plug-in yetしかし、there is third-party version(これは少し古いようです)。

+0

を見てみましょうか? – krosenvold

+0

いいえ、それはGUIフォームと注釈計測を追加することでAnt javacタスクを拡張するAntタスクです。このタスクのソースコードは、IDEA Community Editionのgitリポジトリにあります。 – CrazyCoder

+1

@CrazyCoderヌルポインタの動作をテストするユニットテストの処理をオフに切り替える方法はありますか? iE。 '@ org.junit.Test(expected = NullPointerException.class)'テスト? – Martin

0

JUnitテストでアノテーションの検証を行うことができます。あなたの毒が春であれば

import java.util.Set; 

import javax.validation.ConstraintViolation; 

import junit.framework.Assert; 

import org.hibernate.validator.HibernateValidator; 
import org.junit.Before; 
import org.junit.Test; 
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; 

public class Temp { 
    private LocalValidatorFactoryBean localValidatorFactory; 

    @Before 
    public void setup() { 
     localValidatorFactory = new LocalValidatorFactoryBean(); 
     localValidatorFactory.setProviderClass(HibernateValidator.class); 
     localValidatorFactory.afterPropertiesSet(); 
    } 
    @Test 
    public void testLongNameWithInvalidCharCausesValidationError() { 
     final ProductModel productModel = new ProductModel(); 
     productModel.setLongName("A long name with\t a Tab character"); 
     Set<ConstraintViolation<ProductModel>> constraintViolations = localValidatorFactory.validate(productModel); 
     Assert.assertTrue("Expected validation error not found", constraintViolations.size() == 1); 
    } 
} 

、tools.jarのための交換がjavac2.jarですこれらSpring Unit Tests

関連する問題