Java 如何阻止jersey客户端在Http 301上引发异常?
我正在使用Jersey客户端对我的服务运行一些集成测试。但是,我的一个呼叫发送重定向。我希望得到重定向,但当Jersey客户端得到重定向时,它会出错,出现com.sun.Jersey.api.Client.UniformInterfaceException。有没有办法让它接受重定向的响应并告诉我它得到了什么?您可以捕获UniformInterfaceException,它提供了包含所有详细信息的响应字段 您还可以编写一些hamcrest matchers来表达您的期望: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
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等,您将不会获得异常。然后,您可以读取响应代码并自己发出新请求。我还没有找到一种透明的方法