2013-09-23 1 views
6

Java EE에서 주입 변수를 transient으로 선언해야합니까?Java EE에서 주입 된 변수를 일시적으로 선언해야합니까?

내가 FindBugs 경고 점점 오전 :

클래스 com.playaround.HelloServlet 비 과도 직렬화 인스턴스 필드 accelerationUnit
이 직렬화 가능 클래스도 일시적인 비 기본 인스턴스 필드를 정의하고 정의를, Serializable 또는 java.lang.Object이며, Externalizable 인터페이스 또는 readObject() 및 writeObject() 메소드를 구현하는 것으로 보이지 않습니다.
비 직렬화 가능 객체가이 필드에 저장되어있는 경우,이 클래스의 객체는 올바르게 직렬화 복원되지 않습니다.

플레이의 코드는 다음과 같습니다

/** 
* Sample of a web service reference. 
*/ 
@WebServiceRef 
private AccelerationUnit accelerationUnit; 

같은 질문 @Resource, @Inject 클래스 AccelerationUnit의 정의에서 @PersistenceUnit

답변

7

다름) @Inject와 다른 CDI 주석을 사용하면 장 6.6에서 JSR-299 specification을 확인해야합니다. 콩이 "패시베이션 가능"이라는 정보가 있습니다. EJB 사양에 따라 상태가없고, 싱글 세션 빈에 대해

는, 그들은 EJB (패시베이션가 발생하지 않는 한) 직렬화

마지막 생각과 가장 문제 상태 세션 빈입니다 수 없습니다. 모든 JavaEE 리소스 (EJB, InitialContext, SessionContext 등)는 활성화 후에 복원되지만 다른 직렬화 가능 필드를 처리하고 연결을 열어야합니다. 따라서 IMHO에서는 accelerUnit을 일시적으로 표시하고 ejbActivate 이벤트에서 복원하거나 CDI 및 생산자 방법을 사용하여 필드를 자동으로 주입해야합니다.

+0

질문을 다시 편집하여 AT WebServiceRef로 제한해야합니다. 그 이유는 그 작업이 내가 수행 한 작업 이었기 때문입니다. 그러나 AT PersistenceUnit과 AT EJB를 서블릿에 삽입하면 확장 할 수 있다고 생각하여 동일한 문제가 있음을 알았습니다. –

-3

에이 좋아 만든다 적용

class AccelerationUnit implements Serializable{ 
    // your code here 
    } 
+0

가속화 단위는 웹 서비스이며 직렬화 가능 클래스는 아닙니다. 그것은 예로서 주어졌습니다. –