我正在使用apache cxf jax-rs 3.1.11 webclient。我正在尝试使其自动遵循重定向。
这是我的代码(有点简化):
final WebClient client = WebClient.create(address);
final HTTPConduit httpConduit = WebClient.getConfig(client).getHttpConduit();
httpConduit.getClient().setAutoRedirect(true);
return client
.path("/api")
.accept(MediaType.APPLICATION_JSON)
.post(Entity.entity(requestPacket.toString(), MediaType.APPLICATION_JSON), String.class);
使用此代码,我得到了例外:
Caused by: java.io.IOException: Relative Redirect detected on Conduit '{http://1.2.3.4:5678}WebClient.http-conduit' on '//1.2.3.4:5678/v1/api'
at org.apache.cxf.transport.http.HTTPConduit.convertToAbsoluteUrlIfNeeded(HTTPConduit.java:1857)
at org.apache.cxf.transport.http.HTTPConduit.access$300(HTTPConduit.java:149)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.redirectRetransmit(HTTPConduit.java:1464)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.processRetransmit(HTTPConduit.java:1443)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRetransmits(HTTPConduit.java:1420)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1554)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1356)
... 30 more
现在,查看httpconduit类的来源,我可以看到一个要设置的属性:
private static final String AUTO_REDIRECT_ALLOW_REL_URI = "http.redirect.relative.uri";
但是我无法解决的问题是如何使用CXF API设置该属性?如何更改上述代码以打开此属性?HTTPConduit或HttpClientPolicy似乎没有任何方法可以打开此设置。
您必须将其放在请求上下文中:
WebClient.getConfig(client).getRequestContext().put("http.redirect.relative.uri", "true");