문제
용접 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에 코드를 게시 할 것입니다.