【问题标题】:Jersey test - ExceptionMapper - UniformInterfaceException when HTTP status is not 200Jersey 测试 - ExceptionMapper - HTTP 状态不是 200 时的 UniformInterfaceException
【发布时间】: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


【解决方案1】:

将预期的类类型更改为 com.sun.jersey.api.client.ClientResponse

protected ClientResponse executeGet(String path){
    WebResource resource = resource().path(path);
    Builder builder = resource.header("Content-Type", "application/json;charset=UTF-8");
    return builder.get(ClientResponse.class);
}

现在它能够处理各种 HTTP 状态并解析底层响应:

ClientResponse clientResponse = executeGet("/info");

if (clientResponse.getStatus() == 200)
    CustomResponseType customResponse = clientResponse.getEntity(CustomResponseType.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多