2013-07-30 19 views
5

Tôi đang phát triển một ứng dụng REST bằng Glassfish 4.0.Bộ lọc GlassFish 4 + JAX-RS với @EJB

Trong lớp tài nguyên, tôi có thể tiêm để hoạt động bằng cách tạo lớp @Stateless và tiêm qua @EJB (lớp được tiêm là EJB không trạng thái).

Tuy nhiên, cách tiếp cận này không hoạt động trong bộ lọc JAX-RS. Tôi không thể tiêm thuốc để làm việc cả.

Xem mã bên dưới:

@Provider 
public class UpdateFilter implements ContainerRequestFilter { 

    @EJB 
    private MyBeanInterface doStuffBean; 

    @Override 
    public void filter(ContainerRequestContext requestContext) { 

     ... 
    } 
} 

doStuffBean luôn là null.

Mọi đề xuất?

Trả lời

1

Tôi tin rằng @EJB chỉ hoạt động trong các lớp được quản lý Java EE như các EJB và Servlet khác.

Nếu bạn đang sử dụng CDI, bạn có thể sử dụng chú thích @Inject thay vào đó, nhưng nếu lớp này không phải là ManagedBean thì bạn sẽ cần thực hiện tra cứu.

+0

@Inject không hoạt động. Một ngoại lệ được nêu ra: ** UnsatisfiedDependencyException: Không có đối tượng nào có sẵn để tiêm ... **. – bafitor

+0

Thats bởi vì lớp học của bạn không phải là một bean được quản lý. Tôi không chắc chắn có thể biến Nhà cung cấp này thành ManagedBean, vì vậy bạn có thể phải tạo nhà sản xuất của riêng mình mà tra cứu EJB và sau đó bạn có thể tiêm bất cứ nơi nào (có rất nhiều bài viết cho thấy cách thực hiện điều này) hoặc bạn chỉ có thể thực hiện tra cứu trong lớp này. – ZeusSelerim

0

Hãy thử sử dụng CDI bằng cách thay thế @Stateless bởi @ManagedBean và @EJB bởi @Inject. Điều này làm việc cho tôi trong JAX-RS.

Nếu bạn cần EJB cho những thứ khác ngoài việc tiêm, nó có thể giúp bạn giữ chú thích kép @Stateless @ManagedBean.

+0

Tôi đã thử cả hai giải pháp nhưng nó không hoạt động. Tôi nhận được ** UnsatisfiedDependencyException: Không có đối tượng nào để tiêm. **. Bất kỳ ý tưởng? – bafitor

+1

Tôi chưa từng thấy cái này trước đây với GF3 nên có thể là một vấn đề trong GF4. https://java.net/jira/browse/GLASSFISH-20597 cho biết nó đã được sửa trong phiên bản 4.1.1 - đó có phải là phiên bản bạn đang sử dụng không? Nếu không, bạn có thể thử một số đề xuất giải pháp thay thế tại http://stackoverflow.com/questions/16216759/dependency-injection-with-jersey-2-0 Bạn đã thử xóa @Stateless hoặc bạn có cần nó không? – TheArchitect

Các vấn đề liên quan