2013-09-23 91 views
6

Tôi có nên khai báo các biến được tiêm dưới dạng transient trong Java EE không?Tôi có nên khai báo các biến được tiêm dưới dạng tạm thời trong Java EE không?

Tôi nhận được một cảnh báo FindBugs:

Lớp com.playaround.HelloServlet định nghĩa phi thoáng dụ lĩnh vực phi serializable accelerationUnit
lớp Serializable này định nghĩa một lĩnh vực dụ phi nguyên thủy mà không phải là thoáng qua, Nối tiếp, hoặc java.lang.Object, và không xuất hiện để thực hiện giao diện Externalizable hoặc các phương thức readObject() và writeObject().
Đối tượng của lớp này sẽ không được deserialized một cách chính xác nếu một đối tượng không Serializable được lưu trữ trong lĩnh vực này.

Mã chơi là:

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

Câu hỏi tương tự áp dụng cho @Resource, @Inject, @PersistenceUnit, vv

Trả lời

7

Nó phụ thuộc;) Với @Inject và các chú thích CDI khác, bạn nên kiểm tra chương 6.6 của JSR-299 specification. Bạn đã có thông tin mà đậu là "khả năng thụ động".

Về đậu stateless session và singleton, theo đặc tả EJB, họ không thể được đăng (như ejb thụ động không xảy ra)

nghĩ cuối và khó giải quyết nhất là session bean trạng thái. Tất cả các tài nguyên JavaEE (EJB, InitialContext, SessionContext vv) sẽ được khôi phục sau khi kích hoạt, nhưng bạn phải quản lý các trường không phải tuần tự hóa khác và các kết nối mở. Vì vậy, trong trường hợp của bạn IMHO bạn nên đánh dấu accelerationUnit là thoáng qua và khôi phục trong sự kiện ejbActivate, hoặc liên quan đến phương pháp CDI và nhà sản xuất để tiêm lĩnh vực tự động.

+0

Tôi nên chỉnh sửa lại câu hỏi để giới hạn nó thành AT WebServiceRef chỉ vì đó là những gì tôi đang làm việc. Tuy nhiên, tôi đã nhận thấy tôi có cùng một vấn đề nếu tôi tiêm AT PersistenceUnit và AT EJB trong một servlet vì vậy tôi nghĩ rằng nó có thể được mở rộng. –

-3

Trong định nghĩa của lớp AccelerationUnit, làm cho nó thích:

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

AccelerationUnit là một webserviceclient không phải là một lớp serializable. Nó được đưa ra làm ví dụ. –