Jersey:如何使用带有@Context注释的InjectableProvider?

时间:2011-10-03 09:27:20

标签: java dependency-injection jersey

我跟随this post并由第一个自定义可注射提供程序创建,LocaleProvider扫描HTTP请求以获取 Accept-Language 标头。如果我在Jersey资源中使用它,它可以正常工作:

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

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

但是当我想在ExceptionMapper中使用它时,我不知道如何注入语言环境。我试图将它注释为成员变量:

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

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

但是在部署时失败了:

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

UriInfoHttpServletRequest 等其他内容可以这样注入。如何访问我自己的LocaleProvider?

仅供参考,使用Jersey 1.8进行Glassfish 3.1.1。

1 个答案:

答案 0 :(得分:2)

范围不匹配。 ExceptionMapper是一个单例,而您的注入是每个请求范围。 UriInfo使用ThreadLocals解决它。