【发布时间】:2016-11-30 03:24:29
【问题描述】:
我必须使用 jersey-test-framework-grizzly2 测试 Jersey 1.19。有注册 REST 端点和异常映射器类的配置类:
public class ConfiguredMyServiceTest extends JerseyTest {
@Override
protected int getPort(int defaultPort) {
return 8080;
}
public static class AppConfig extends DefaultResourceConfig {
public AppConfig() {
getSingletons().add(new ExceptionMapperProvider());
getSingletons().add(new MyService());
}
}
@Override
public WebAppDescriptor configure() {
return new WebAppDescriptor.Builder()
.initParam(WebComponent.RESOURCE_CONFIG_CLASS,
AppConfig.class.getName())
.build();
}
}
当我执行/测试返回 HTTP 状态 200 的 REST 端点时,它运行良好。
如果抛出异常,异常映射器会很好地处理它并形成返回对象 javax.ws.rs.core.Response 并带有错误代码:
@Provider
@Singleton
public class ExceptionMapperProvider implements ExceptionMapper<Exception>{
@Override
public Response toResponse(final Exception exception){
return Response.status(HttpStatusCodes.STATUS_CODE_SERVER_ERROR).entity(new BasicResponse(InternalStatus.UNHANDLED_EXCEPTION, exception.getMessage())).type(MediaType.APPLICATION_JSON).build();
}
}
但是,我明白了
com.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:8080/v1/my-service/ returned a response status of 401 Unauthorized
当我尝试在我的 JUnit 测试中断言 Response 时。如何获得格式良好的响应而不是 UniformInterfaceException?
【问题讨论】:
-
您是否有任何身份验证处理程序,因为 401 意味着您无法进行身份验证?虽然我不知道你的常量 STATUS_CODE_SERVER_ERROR 的结果是什么。这实际上是 401 吗?
-
STATUS_CODE_SERVER_ERROR 表示 500。我为 SO 简化了 ExceptionMapper,因此删除了一些部分。但是,不管它是 401、500 还是其他错误代码,问题都是一样的——当我测试时,我得到的是 UniformInterfaceException 而不是 Response。
-
我建议启用日志过滤器,以便您可以看到请求/响应。如果您从未使用过,请在此处查看。您是否看到请求会影响您的休息服务?这是在客户端启用日志过滤器的示例。 stackoverflow.com/questions/2332515/… 您可能还希望在 LoggingFilter 构造函数中将布尔打印实体设置为 true。这将验证 401 确实来自服务器,而不是客户端配置的问题。
-
我在端点和异常映射器代码中放置了断点,因此两者都被命中/执行。
标签: java rest jersey jax-rs exceptionmapper