Java 如何将@Context注释字段注入RestEasy@Provider?

Java 如何将@Context注释字段注入RestEasy@Provider?,java,jboss,resteasy,jmockit,Java,Jboss,Resteasy,Jmockit,使用JBoss容器中的RestEasy,我有一个用@Provider注释的ExceptionMapper,它可以通过@Context注释访问HttpServletRequest和HttpServletResponse,如下所示: @Provider public class MyExceptionMapper implements ExceptionMapper<Throwable> { @Context private HttpServletRequest httpServ

使用JBoss容器中的RestEasy,我有一个用
@Provider
注释的
ExceptionMapper
,它可以通过
@Context
注释访问
HttpServletRequest
HttpServletResponse
,如下所示:

@Provider
public class MyExceptionMapper implements ExceptionMapper<Throwable> {
  @Context
  private HttpServletRequest httpServletRequest;

  @Context
  private HttpServletResponse httpServletResponse;

  @Override
  public Response toResponse(final Throwable exception) {
    ...
    return response;
  }
}
但这会导致在我第一次引用
@Context
字段时,
MyExceptionMapper
中出现
NullPointerException
,它告诉我它们没有被注入

我也试过:

  • 使用
    @Mocked
    而不是
    @Injectable
  • 直接实例化带有和不带有
    @Tested
    注释的
    MyExceptionMapper
  • 在我的测试中创建
    期望值
    ;及
  • 上面的每一个排列
在所有情况下,
@Context
-注释字段均为
null


希望我只是错过了一些非常明显的东西?

在没有更好的答案的情况下,我最终在测试中使用反射来为这两个属性注入值。不理想,但它可以工作:

public class MyExceptionMapperTest {
  @Mocked
  private HttpServletRequest mockHttpServletRequest;

  @Mocked
  private HttpServletResponse mockHttpServletResponse;

  private MyExceptionMapper exceptionMapper = new MyExceptionMapper();

  @Before
  public void setup() {
    Field httpServletRequest = exceptionMapper.getClass().getDeclaredField("httpServletRequest");
    httpServletRequest.setAccessible(true);
    httpServletRequest.set(exceptionMapper, mockHttpServletRequest);

    Field httpServletResponse = exceptionMapper.getClass().getDeclaredField("httpServletResponse");
    httpServletResponse.setAccessible(true);
    httpServletResponse.set(exceptionMapper, mockHttpServletResponse);
  }
}
然后在测试中,我可以将两个
@Mocked
值设置为正常值


我不是反射方面的专家,所以这可能不是最好/最有效的方法,但它已经足够满足我的需要了。

您是否使用
-javaagent
参数来初始化JMockit?@Rogério-并非故意。我只是在IntelliJ中以普通JUnit测试的方式运行这些测试,在Maven POM中我看不到任何对
-javaagent
的引用。我应该使用它吗?如果你使用最新版本的JMockit,那么是的。
public class MyExceptionMapperTest {
  @Mocked
  private HttpServletRequest mockHttpServletRequest;

  @Mocked
  private HttpServletResponse mockHttpServletResponse;

  private MyExceptionMapper exceptionMapper = new MyExceptionMapper();

  @Before
  public void setup() {
    Field httpServletRequest = exceptionMapper.getClass().getDeclaredField("httpServletRequest");
    httpServletRequest.setAccessible(true);
    httpServletRequest.set(exceptionMapper, mockHttpServletRequest);

    Field httpServletResponse = exceptionMapper.getClass().getDeclaredField("httpServletResponse");
    httpServletResponse.setAccessible(true);
    httpServletResponse.set(exceptionMapper, mockHttpServletResponse);
  }
}