2013-12-19 2 views
7

마지막 방법을 지원하지 않습니다왜 CDI 콩 난 그냥 글래스 피쉬 서버에서 악명 높은 JavaEE 어플 CDI 오류가 발생

org.glassfish.deployment.common.DeploymentException: CDI deployment failure:Exception List with 2 exceptions: 
Exception 0 : 
org.jboss.weld.exceptions.DeploymentException: WELD-001437 Normal scoped bean class ASController is not proxyable because the type is final or it contains a final method public final void ASController.selectPath(org.primefaces.event.NodeSelectEvent) - Managed Bean [class ASController] with qualifiers [@Default @Any @Named]. 

오류가 그가 내 마지막 방법을 좋아하지 않는다는 사실에 매우 설명이되는 것입니다 CDI 빈, 그러나 나는 왜 이해할 수 없다. 이 링크

http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html_single/#d0e1429

에서

는 그들은 직렬화 함께 할 수있는 뭔가입니다 설명하지만 어렵지 않은 마지막 방법을 하나 이상이어야한다 최종 방법으로 클래스를 직렬화 이유는 볼 수 없습니다.

답변

12

글쎄, 프록시 개체를 구현할 수있는 몇 가지 방법이 있습니다. 그러나 프록시가 프록시 된 bean과 "같은"유형을 가지기를 기대하기 때문에, 상속 (또는 당신이 구현할 수있는 인터페이스를 사용해야 만합니다. 그러나 이것은 모든 POJO가 bean이 될 수있는 접근 방식이 아닙니다. CDI).

즉, 내부적으로 삽입하려는 클래스에서 확장하고 그 주위에 프록시 코드를 생성하고 해당 하위 클래스를 제공합니다.

이 프록시는 모든 마법을 처리하여 컨텍스트에 맞는 빈을 항상 갖도록합니다.이 빈은 모든 멤버 변수 빈이 올바른 빈을 가리키고 있습니다.

그래서 실제로 삽입 할 빈의 유형은 아니지만 해당 빈의 프록시 서브 클래스입니다. 이것은 최종 메서드와 클래스 및 개인 생성자에서는 제대로 작동하지 않습니다.

클래스가 final이 아닌 경우 프록시는이 클래스를 확장 할 수 있지만 사용자의 최종 메소드를 쉽게 덮어 쓸 수는 없습니다. 그러나 이것은 필요할 수도 있습니다 (예 : bean이 직렬화되면 프록시가이를 직렬화 해제해야 함).

더 복잡한 방법이 있습니다. 하나는 에이전트를 통해 클래스의 바이트 코드를 조작하여이 기능을 주입 할 수 있습니다 (예 : 최종 수정 자 제거, 기본 생성자 주입 ...). 그리고 이것을 상속과 혼합 할 수도 있지만 이것은 아직 구현되지 않았습니다. 또한 여러 JVM 구현을 지원하는 것은 간단합니다.)

참고 용접의 릴리스 가능성이 제한에 대한 비표준 해결 을 지원

사용이이 릴리스 될 예정입니다 것을 나타내는 메모가 링크 된 자원에서

비 휴대용 JVM API를 : 일, IcedTea, 맥 : Unsafe.allocateInstance() (가장 효율적인) IBM,하는 JRockit : ReflectionFactory.newConstructorForSerialization()

하지만 우리는하지 않았다 이것을 구현하기 위해 주위를 돌아보십시오.

+0

ok 이제는 다른 대답이 정확했지만이 것은 좀 더 정교합니다. – dendini

10

컨테이너는 주입 된 클래스에 대한 프록시 객체를 만듭니다. 따라서 컨테이너는 클래스를 사용하지 않지만 이러한 클래스는 확장됩니다. Java는 최종 클래스를 확장 할 수 없으므로 CDI에서 최종 클래스를 사용할 수 없습니다.

+0

내 수업은 최종 방법이 아니므로 CDI에서 확장 할 수 있습니다. – dendini

+2

문제는 동일한 프록시 클래스가 메서드를 재정의하지만 최종 프록시가 해당 프록시를 재정의 할 수없는 경우 – Fireworks