문제

용접 1.1.13을 사용하여 Arquillian 테스트에서 ....

필드에 휘발성이있는 필드로 주입하자. 주입 지점을 소유하고 싶어하는 재산과 같은 것이 변경 될 수 있습니다. CDI 확장자를 만드는 것에 대해 생각했습니다.

ProcessAnnotatedType 이벤트를 붙잡고 필드 주입 지점에 맞춤 주석이있는 모든 필드를 찾고

 <T> void pat(@Observes ProcessAnnotatedType<T> event, BeanManager bm) {
   final AnnotatedType<T> target = event.getAnnotatedType();

   for (AnnotatedField<? super T> field : target.getFields())
     if (field.isAnnotationPresent(Value.class)) {  // ignore that I don't check @Inject here for the moment
        CtClass wrapper = pool.get(target.getJavaClass().getName());
        ConstPool cp = wrapper.getClassFile().getConstPool();

        CtMethod m = CtNewMethod.make(....)
        ....
        wrapper.addMethod(m);

        event.setAnnotatedType(bm.createAnnotatedType(wrapper.toClass()));
     }
 }
.

는 그 이후에 필드의 모든 주입 지점을 가져 와서 기본 웰링 필드를 "랩퍼"유형에 해당하는 새로운 필드로 대체했습니다. 그렇지 않으면 빈 유효성 검사가 실패합니다.

그러나 이것은 시동 중에 만 STOMP 설정에서만 작동하지 않습니다. 예를 들어 Arquillian은 Bean Manager를 사용하여 내 "랩"중 하나를 주입하는 클래스를 초기화합니다. Bean Resolver는 Bean을 찾기 위해 해시 키로 유형을 사용하기 때문에 사실이 실패합니다.

기본적으로 CDI가 사용자 정의 이벤트를 수신하는 추가 방법으로 CDI에 의해 주석이 달린 클래스를 "마스크"할 수 있다고 생각하지 않습니다. 시원했을 것이지만 유형은 유형입니다 (즉, equals / hashcode를 프록시하거나 가짜를 가짜 또는 위조하는 방법을 알지 못합니다).

도움이 되었습니까?

해결책

알았습니다.TypesAfeBeanResolver Resolver (적어도 CDI 용접 구현) 내에서 컴퓨팅 값 함수 (Google Extension)를 켜십시오.방금 클래스를 확장하면 다음을 수행하십시오.

 CtClass wrapper = pool.makeClass(target.getJavaClass().getName()+"Proxy");
 wrapper.setSuperclass(pool.get(target.getJavaClass().getName()));
 .....
 final AnnotatedType<T> other = bm.createAnnotatedType(wrapper
                    .toClass());
.

모든 것이 잘 작동합니다.Bean에서 이벤트를 캡처하는 테스트를 테스트했습니다.코멘트가있는 GIST에 코드를 게시 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top