2011-10-03 40 views
7

Tôi đã theo dõi this post và được tạo bởi nhà cung cấp tiêm tùy chỉnh đầu tiên, LocaleProvider quét yêu cầu HTTP cho tiêu đề Accept-Language. Nó hoạt động tốt nếu tôi sử dụng nó trong vòng một nguồn tài nguyên Jersey:Jersey: cách sử dụng InjectableProvider với chú thích @Context?

@Path("test") 
@GET 
public Response getStatus(@Context Locale locale) { 
    log.finer("Locale: "+ locale); 

    Response response = Response 
      .noContent() 
      .build(); 
    return response; 
} 

Nhưng khi tôi muốn sử dụng nó trong một ExceptionMapper Tôi không biết làm thế nào để tiêm miền địa phương. Tôi đã cố gắng để chú thích nó như là một biến thành viên:

public class MyExceptionMapper implements ExceptionMapper<MyException> { 
    @Context 
    private Locale locale; 

    @Override 
    public Response toResponse(MyException ex) { 
    ... 
    } 
} 

nhưng điều này không thành công ở việc triển khai:

The following errors and warnings have been detected with resource and/or provider classes: 
SEVERE: Missing dependency for field: private java.util.Locale com.package.MyExceptionMapper.locale 

Những vấn đề khác như UriInfo hoặc HttpServletRequestthể được tiêm như thế. Làm cách nào để tôi có quyền truy cập vào LocaleProvider của chính mình?

FYI đây là trên Glassfish 3.1.1 sử dụng Jersey 1.8.

+0

Hey Hank, bạn đã bao giờ có thể nhận được LocaleProvider này làm việc với một ExceptionMapper? –

+1

Không. Tôi đã thực hiện phát hiện locale bên trong ExceptionMapper. Tôi có lẽ nên đóng câu hỏi này ... – Hank

Trả lời

2

Có phạm vi không khớp. ExceptionMapper là một singleton, trong khi injectable của bạn là per-request-scope. UriInfo làm việc xung quanh nó bằng cách sử dụng ThreadLocals.

+4

Cảm ơn. Theo ý kiến ​​của bạn, cách tốt nhất để chuyển tiếp là gì? Tôi có thể làm việc xung quanh nó bằng cách sử dụng ThreadLocals, quá? Hoặc tôi không nên lo lắng về DRY và chỉ cần triển khai mã phát hiện Locale bên trong ExceptionMapper? – Hank

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