在 Apache CXF JAX-RS 中,如何打开 AUTO_REDIRECT_ALLOW_REL_URI 标志?

In Apache CXF JAX-RS, how to turn on AUTO_REDIRECT_ALLOW_REL_URI flag?

我正在使用 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.access0(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 class 的源代码,我可以看到一个 属性 设置来解决这个问题:

 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");