2010-09-19 9 views
5

Tôi đang sử dụng Jersey 1.4 ea cùng với Spring 3.0 và tích hợp jersey-spring. Việc tích hợp Jersey và Spring hoạt động tốt đối với các lớp tài nguyên như được mô tả here. Làm thế nào tôi muốn tiêm một thành phần mùa xuân vào một ContainerRequestFilter để thực hiện một số xử lý trước các yêu cầu.Jersey: Đưa thành phần Spring vào ContainerRequestFilter

@Component 
public class SecurityFilter implements ContainerRequestFilter { 

    // UserManager is a declared spring component 
    // Injecting it should work somehow 
    @Autowired 
    private UserManager userManager; 

    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
     System.out.println(userManager); 
     // prints out null on request 
    } 
} 

Cả bộ lọc lẫn bean quản lý người dùng được đăng ký khi tôi triển khai ứng dụng cho Glassfish. Tôi tự hỏi tôi đang làm gì sai. Có cách nào để tiêm một bean quản lý mùa xuân vào một ContainerRequestFilter?

CẬP NHẬT

Loại giải quyết. Vấn đề là Jersey không có được Spring bean nếu các bean này là các proxy Java (trái ngược với các lớp proxy được tạo ra). Vấn đề có thể được giải quyết bằng cách hướng dẫn Spring để LUÔN LUÔN sử dụng các lớp proxy thay vì Java Proxies bằng cách xác định thuộc tính proxy-target-class="true" trong các phần tương ứng của cấu hình lò xo. Trong kịch bản của tôi, tôi phải xác định nó trên <tx:annotation-driven proxy-target-class="true" />.

Xem here để có phân tích chi tiết hơn và có thể khắc phục được điều đó.

+0

Trong giải pháp của bạn, cách SecurityFilter được đăng ký trong tệp web.xml hoặc ở một nơi khác? Tôi có một vấn đề ở đây https://stackoverflow.com/q/45509183/4636715 trong đó ContainerRequestFilter không được truy cập ở tất cả. – vahdet

Trả lời

2

Tôi thấy điều tương tự với Jersey 1.6 và Spring 3.0.5. Sử dụng trình gỡ lỗi, tôi có thể nói rằng mặc dù mã của tôi được đánh dấu bằng @Component, cả mùa xuân và Jersey sẽ nhanh chóng sao chép riêng của họ của lớp này:

@Path("/beams") 
@Produces("text/xml") 
@Component 
@Scope("singleton") 
public class BeamsResource { 
} 

Có một số huyên thuyên rằng điều này sẽ được thêm vào trong một tương lai phiên bản của Jersey, nhưng nó dường như không hoạt động. Tôi biết đây là một giải pháp ghê gớm, nhưng tôi đang sử dụng một biến thành viên tĩnh để kết nối với nhau Jersey và Spring trong thời gian này. Bleh.

+1

Cuối cùng tôi đã đi qua một giải pháp cho việc này. Gỡ lỗi mã hóa ra nó là một vấn đề trong cách Jersey thu được các bean Spring từ ngữ cảnh. Suy nghĩ của tôi được ghi lại http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre

+0

Xem thêm cập nhật về câu hỏi của tôi. – nre