Java 如何阻止jersey客户端在Http 301上引发异常?

Java 如何阻止jersey客户端在Http 301上引发异常?,java,jersey,jersey-client,Java,Jersey,Jersey Client,我正在使用Jersey客户端对我的服务运行一些集成测试。但是,我的一个呼叫发送重定向。我希望得到重定向,但当Jersey客户端得到重定向时,它会出错,出现com.sun.Jersey.api.Client.UniformInterfaceException。有没有办法让它接受重定向的响应并告诉我它得到了什么?您可以捕获UniformInterfaceException,它提供了包含所有详细信息的响应字段 您还可以编写一些hamcrest matchers来表达您的期望: import stati

我正在使用Jersey客户端对我的服务运行一些集成测试。但是,我的一个呼叫发送重定向。我希望得到重定向,但当Jersey客户端得到重定向时,它会出错,出现com.sun.Jersey.api.Client.UniformInterfaceException。有没有办法让它接受重定向的响应并告诉我它得到了什么?

您可以捕获UniformInterfaceException,它提供了包含所有详细信息的响应字段

您还可以编写一些hamcrest matchers来表达您的期望:

import static javax.ws.rs.core.Response.Status.*;
import static org.junit.rules.ExpectedException.*;

import javax.ws.rs.core.Response.Status;

import org.hamcrest.*;
import org.junit.*;
import org.junit.rules.ExpectedException;

import com.sun.jersey.api.client.*;

public class MyResourceShould {

    @Rule
    public ExpectedException unsuccessfulResponse = none();

    private WebResource resource;

    @Before
    public void setUp() {
        Client client = Client.create();
        client.setFollowRedirects(false);
        resource = client.resource("http://example.com");
    }

    @Test
    public void reportMovedPermanently() {
        unsuccessfulResponse.expect(statusCode(MOVED_PERMANENTLY));

        resource.path("redirecting").get(String.class);
    }

    public static Matcher<UniformInterfaceException> statusCode(Status status) {
        return new UniformInterfaceExceptionResponseStatusMatcher(status);
    }

}

class UniformInterfaceExceptionResponseStatusMatcher extends TypeSafeMatcher<UniformInterfaceException> {

    private final int statusCode;

    public UniformInterfaceExceptionResponseStatusMatcher(Status status) {
        this.statusCode = status.getStatusCode();
    }

    public void describeTo(Description description) {
        description.appendText("response with status ").appendValue(statusCode);
    }

    @Override
    protected boolean matchesSafely(UniformInterfaceException exception) {
        return exception.getResponse().getStatus() == statusCode;
    }

}
import static javax.ws.rs.core.Response.Status.*;
导入静态org.junit.rules.ExpectedException.*;
导入javax.ws.rs.core.Response.Status;
导入org.hamcrest.*;
导入org.junit.*;
导入org.junit.rules.ExpectedException;
导入com.sun.jersey.api.client.*;
公共类MyResourceShould{
@统治
public ExpectedException unsuccessfulResponse=none();
私有网络资源;
@以前
公共作废设置(){
Client=Client.create();
client.setFollowRedirects(false);
资源=客户端。资源(“http://example.com");
}
@试验
公共无效报告永久移动(){
响应失败。预期(状态代码(永久移动));
resource.path(“重定向”).get(String.class);
}
公共静态匹配器状态代码(状态){
返回新的UniformInterfaceExceptionResponseStatusMatcher(状态);
}
}
类UniformInterfaceExceptionResponseStatusMatcher扩展了TypeSafeMatcher{
专用最终int状态码;
公共统一接口例外响应StatusMatcher(状态){
this.statusCode=status.getStatusCode();
}
公共无效说明(说明){
description.appendText(“带状态的响应”).appendValue(状态代码);
}
@凌驾
受保护的布尔匹配安全(UniformInterfaceException异常){
返回异常。getResponse().getStatus()==statusCode;
}
}

还要注意的是,为了获得UniformInterfaceException而不是follow redirect(如果在Location header中指定了一个重定向),follow redirects(在setUp method中)应该设置为false。

您是否设法解决了它?如果您将实体类型设置为ClientResponse而不是String等,您将不会获得异常。然后,您可以读取响应代码并自己发出新请求。我还没有找到一种透明的方法