以下代码在使用 JAVA-8 编译时运行良好,但在 JAVA-11 中编译时不起作用。 我的项目是一个 gradle 构建项目。在这个项目中,我调用了一个在 SOAP 标头中传递身份验证详细信息的 Web 服务。
当我在 Wireshark 中跟踪项目时,我注意到在 JAVA-8 编译版本和 JAVA-11 编译版本中的区别在于 SOAP Header 没有添加到 JAVA-11 编译版本中的请求中,因此在server.log 以及来自 Web 服务的响应失败,因为标头部分中缺少身份验证详细信息。
服务器日志
2021-07-22 09:15:20,585 WARNING [com.sun.xml.ws.wspolicy.EffectiveAlternativeSelector] (default task-1) WSP0075: Policy assertion "{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}SupportingTokens" was evaluated as "UNKNOWN".
2021-07-22 09:15:20,585 WARNING [com.sun.xml.ws.wspolicy.EffectiveAlternativeSelector] (default task-1) WSP0019: Suboptimal policy alternative selected on the client side with fitness "UNKNOWN".
以下是我使用的两个依赖项:-
[group: 'com.sun.xml.bind',name: 'jaxb-impl',version: '2.3.4'],[group: 'com.sun.xml.ws',name: 'jaxws-ri',version: '2.3.4']
SOAP Header 在下面的类中创建 -
import javax.xml.ws.BindingProvider;
public abstract class AbstractHeaderProxy {
protected String endpoint;
protected static final String ENDPOINT_ADDRESS = "javax.xml.ws.service.endpoint.address";
public static final String WS_username = "ws-security.username";
public static final String WS_PASSWORD = "ws-security.password";
public void setupPort() {
final PropertyConfigData commnProps = getcommonProperties();
final String endpoint = "http://10.20.9.44:80/INVDetails/INVDetailsV2?WSDL";
final String username = "abc";
final String password = "abc123";
getPortBindingProvider().getRequestContext().put(ENDPOINT_ADDRESS,endpoint);
getPortBindingProvider().getRequestContext().put(WS_username,username);
getPortBindingProvider().getRequestContext().put(WS_PASSWORD,password);
}
public abstract String getEndPoint();
public abstract BindingProvider getPortBindingProvider();
}
JAVA-11 是否缺少某些依赖项? 或者有没有办法以不同的方式创建这个 SOAP 标头,以便它附加到请求中?