私は2つの側面からアドバイスされたいくつかのメソッドを持っています.1つはSpring AOPサポートを使用しており、もう1つは注釈付きのすべてのメソッドをアドバイスするBeanPostProcessor
(MethodValidationPostProcessor
具体的には)です。@Validation
私の単体テストでは、メソッド コントラクトを破って強制的にエラーをスローしようとしていますが、検証が適切に行われている場合 (上記のポスト プロセッサによって課されたアドバイス) があり、機能しない場合もあります。誰かが似たようなことを経験したことがありますか。
ここに私がやろうとしていることの小さなスニペットがあります:
アスペクトコード:
@Aspect
@Component
public final class LoggingAspect {
@Before(value = "execution(public * * (..)) && @annotation(loggable)",
argNames = "joinPoint, loggable")
public void before(JoinPoint joinPoint, Loggable loggable) {
//logging here...
}
}
注釈 (ログ可能なコード)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Loggable {...}
@Validated アノテーションが付けられているインターフェイス (関連情報へのリンクはこちら)。
@Validated
public interface Dao<T, K> {
T findById(@NotNull K id);
T persist(@NotNull T object);
}
このインターフェースを実装する基本クラス: public abstract class BaseDao implements DAO { @Loggable public T persist(T object){...} }
そして、特定の動作を持つサブクラス: public final class UserDao extends BaseDao { @Loggable public T findById(User object){...} }
そして、春のコンテキストはついにこのようなものになりました
<aop:aspectj-autoproxy/>
<context:annotation-config/>
<context:component-scan base-package="com.my.package"/>
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
null を引数として両方のメソッドを呼び出してテストしていますが、@Validated アノテーション付きインターフェイスのすべてのパブリックメソッドをアドバイス/インターセプトする代わりに、によって発生したと思われるIllegalArgumentException: attempt to create saveOrUpdate event with null entity
代わりにを受け取った場合があります。MethodConstraintViolationException
MethodValidationInterceptor
編集: 私は春 3.1、Hibernate Validator 4.2 (春の必要に応じて)、aspectj 1.7 を使用しています。
編集 2 : テスト コードをさらに掘り下げたところ、MethodValidationPostProcessor または MethodValidationInterceptor に関連する何か奇妙なことがわかりました。aop-autoproxy を無効にして、テスト中に LoggerAspect を削除しましたが、検証が期待どおりの結果になる場合や、MethodValidationInterceptor または MethodValidator が失敗するはずなのに失敗する場合があるという問題がまだあります。呼び出しでエラーをキャッチします。