Tôi muốn lấy bean từ phương thức sản xuất để đọc các thuộc tính của nó. Trong một số trường hợp, đậu là một hạt đậu EJB Singleton
.injectionPoint.getBean() trả về null nếu bean là bean EJB trong Java EE 7 (CDI 1.1)
Tôi đã đơn giản hóa mã của mình để tập trung vào vấn đề.
vòng loại đơn giản của tôi:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface InjectMe {}
Simple sản xuất:
@Dependent
public class SimpleProducer {
@Produces
@InjectMe
public String getInjectMe(InjectionPoint ip) {
// ip.getBean() returns null for some reason
return "ip=" + ip + ", bean=" + ip.getBean();
}
}
EJB (Singleton):
@Singleton
@Startup
public class SimpleSingleton {
@Inject
@InjectMe
private String injectMe;
@PostConstruct
public void init() {
System.out.println(injectMe);
}
}
điều khiển đầu ra:
Thông tin: ip = [BackedAnnotatedField] @Inject @InjectMe com.test.ejb.SimpleSingleton.injectMe tin,
bean=null
Khi tôi thay đổi Singleton
đậu để CDI
đậu tất cả mọi thứ hoạt động tốt (ip.getBean()
lợi nhuận không phải là null). Nó cũng hoạt động trong Java EE 6
thậm chí với Singleton
đậu nhưng không có trong Java EE 7
. Tôi đang sử dụng máy chủ ứng dụng Glassfish 4.
Hành vi này có được chỉ định ở đâu đó không?
Nghe giống như lỗi thủy tinh. –
@JohnAment: Đừng nghĩ như vậy, cùng một hành vi cho WildFly. Không thể trả lời câu hỏi, nhưng các lý do có thể có thể là: 1) thay đổi hành vi của mô-đun phát hiện bean (mặc định: 'chú thích'); 2) tiêm một chuỗi lớp (không theo ngữ cảnh); 3) không có phạm vi được khai báo nào ngoài 'Phụ thuộc ' –
Nếu bạn gọi' ip.getMember(). GetDeclaringClass() ', bạn sẽ nhận được cả hai trường hợp FQCN, điều này cũng được sử dụng làm ví dụ trong tài liệu API InjectionPoint và Tôi đã nhìn thấy nó trong một ví dụ Deltaspike như một cuộc gọi tiếp theo sau khi 'bean' là' null'. –