2012-11-16 27 views
8

Tôi đang sử dụng ejb 3 và cố gắng @Inject HttpServletRequest, nhưng trong khi triển khai tôi xảy ra ngoại lệ.Tiêm HttpServletRequest

Code:

@Inject private HttpServletRequest httpRequest; 

Ngoại lệ:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers [@Default] at injection point [[field] @Inject private com.kmware.ttk.highway.beans.session.UserSessionBean.httpRequest] 

tôi có thể làm gì với điều đó?

Trả lời

17

Vòng đời của HttpServletRequest được quản lý bởi vùng chứa EJB/web, không phải là vùng chứa CDI. Cố gắng tiêm nó dẫn đến các vấn đề bởi vì thường có nhiều triển khai của giao diện, và thùng chứa CDI của bạn không có đủ thông tin để đưa ra quyết định về việc thực thi nào để tiêm. Ngay cả khi bạn đã tiêm thành công một phiên bản của nó, nó sẽ không là trường hợp giống như được quản lý bởi vùng chứa EJB.

Để có được một trường hợp được quản lý đúng yêu cầu, làm điều này thay vì:

@Context 
private HttpServletRequest httpRequest; 
+2

Ý của bạn là @ javax.ws.rs.core.Context? –

+1

@KirillBazarov - vâng, đó là chú thích để sử dụng. – Perception

+0

@KirillBazarov - điều này có giải quyết được sự cố của bạn không? Nếu cảm thấy tự do để upvote/chấp nhận câu trả lời này. Cảm ơn. – Perception

7

Nếu phụ thuộc của bạn là một-RS JAX (Restful) lớp sau đó lưu ý các câu trả lời ở trên. Mặt khác, nếu bạn có một sự sắp xếp phức tạp hơn về tiêm phụ thuộc thì câu hỏi chắc chắn là hợp lệ.

Khả năng này đã được thêm vào đặc tả CDI 1.1 (JSR-346) mà lần lượt đã được thêm vào đặc tả Java EE 7 mới. Nói cách khác, lớp máy chủ ứng dụng Java Enterprise mới nhất sẽ có thể xử lý điều này. Trong khi chờ đợi, nếu bạn cần để có thể quản lý một số phụ thuộc phạm vi yêu cầu mà trong thời hạn cần truy cập vào thông tin HttpServletRequest thực tế, bạn có thể sử dụng cách tiếp cận của bạn và sử dụng công cụ JBoss Solder. (Đừng hoảng sợ nếu trang web có vẻ không còn tồn tại, thực tế của vấn đề là công việc đã được chuyển sang triển khai thực hiện chính thức CDI 1.1 — tức là "Weld 2" —có nghĩa là chúng không hoạt động trên hàn nữa. hoàn toàn phù hợp cho CDI 1.0.)

Các phụ thuộc maven sẽ

<dependency> 
    <groupId>org.jboss.solder</groupId> 
    <artifactId>solder-api</artifactId> 
    <version>3.2.0.Final</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.solder</groupId> 
    <artifactId>solder-impl</artifactId> 
    <version>3.2.0.Final</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 
Các vấn đề liên quan