Java/JAX-WS:调用webservice在本地工作,在glassfish上失败。身份验证问题(SP0105)

Java/JAX-WS:调用webservice在本地工作,在glassfish上失败。身份验证问题(SP0105),java,web-services,glassfish,jax-ws,Java,Web Services,Glassfish,Jax Ws,我想做的是编写一段代码(部署在glassfish上的更大web应用程序的一部分),通过webservice连接到其他系统。然而,我只编写客户端,所以我假设我不能更改WSDL或修改服务器端的任何内容(包括auth,这可能是这里的一个问题)。我是网络服务新手,所以请写下尽可能简单的答案 我能够从WSDL生成类,编写连接到webservice的简单命令行应用程序,添加安全性头(添加明文用户名/密码,详见下文),调用一些方法并打印结果。在命令行上一切正常,但如果我将此代码附加到“Biger webapp

我想做的是编写一段代码(部署在glassfish上的更大web应用程序的一部分),通过webservice连接到其他系统。然而,我只编写客户端,所以我假设我不能更改WSDL或修改服务器端的任何内容(包括auth,这可能是这里的一个问题)。我是网络服务新手,所以请写下尽可能简单的答案

我能够从WSDL生成类,编写连接到webservice的简单命令行应用程序,添加安全性头(添加明文用户名/密码,详见下文),调用一些方法并打印结果。在命令行上一切正常,但如果我将此代码附加到“Biger webapp”(部署在glassfish上),我将得到以下错误:

SP0105:wsdl中必须存在SymmetricBinding/AsymmetricBinding/TransportBinding断言

我不是从那里得到它的——如果它是从命令行(在glassfish之外)工作的,为什么它在glassfish上部署时需要更多的东西

我正在使用此页面中的提示:

要提供更多信息,请使用以下代码:

用于解析端点和调用服务的代码片段(位于文件EndpointResolver.java中):

HeaderHandlerResolver(实现javax.xml.ws.handler.HandlerResolver)最重要的方法ID:

public List<Handler> getHandlerChain(PortInfo portInfo) {
    List<Handler> handlerChain = new ArrayList<Handler>();

    handlerChain.add(headerHandler); //injected to HeaderHandlerResolver

    return handlerChain;
}
公共列表getHandlerChain(PortInfo-PortInfo){
List handlerChain=new ArrayList();
handlerChain.add(headerHandler);//注入HeaderHandlerResolver
返回手柄链;
}
HeaderHandler句柄方法(auth在此处:))

公共布尔handleMessage(SOAPMessageContext smc){
Boolean outboundProperty=(Boolean)smc.get(MessageContext.MESSAGE\u OUTBOUND\u属性);
if(outboundProperty.booleanValue()){
SOAPMessage=smc.getMessage();
试一试{
SOAPEnvelope信封=smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader=envelope.addHeader();
SOAPElement security=header.addChildElement(“安全”、“wsse”,
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken=security.addChildElement(“usernameToken”,“wsse”);
usernameToken.addAttribute(新的QName(“xmlns:wsu”),”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement用户名=usernameToken.addChildElement(“用户名”,“wsse”);
username.addTextNode(“myUsername”);
SOAPElement password=usernameToken.addChildElement(“密码”、“wsse”);
password.setAttribute(“类型”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
addTextNode(“myPassword”);
}捕获(SOAPE例外){
log.warn(如getMessage());
e、 printStackTrace();
}
}否则{
试一试{
//此处理程序不处理来自Web服务的响应,因此
//我们只是打印出SOAP消息。
logSOAPMessage(smc.getMessage());
}捕获(例外情况除外){
log.warn(例如getMessage());
例如printStackTrace();
}
}
归还境外财产;
}
@凌驾
公共集getHeaders(){
返回null;
}
(...)
非常感谢您在这方面的帮助

编辑: 以下是wsdl文件中的“策略”部分(如前所述,我无法更改):


我将回答我自己的问题:

有两件事需要解决上述问题。首先需要在glassfish上更新metro库(我已经将其更新为2.1.1版,所以更新了lib/webservices-rt.jar、lib/webservices-tools.jar、lib/annowed/webservices-api.jar库)。这解决了SP0105错误,但生成了一个新的错误(标题处的某个地方的ClassCastException)。 为了修复第二个问题,我删除了HeaderHandler/HeaderHandlerResolver类,而不是:

service.setHandlerResolver(headerHandlerResolver);
endpoint = service.getPort(EFormsPortType.class);
称为:

endpoint = service.getPort(EFormsPortType.class);
Map<String, Object> requestContext = ((javax.xml.ws.BindingProvider) endpoint).getRequestContext();
requestContext.put(javax.xml.ws.BindingProvider.USERNAME_PROPERTY, config.getProperty("myUser");
requestContext.put(javax.xml.ws.BindingProvider.PASSWORD_PROPERTY, config.getProperty("myPassword");
endpoint=service.getPort(EFormsPortType.class);
Map requestContext=((javax.xml.ws.BindingProvider)端点);
requestContext.put(javax.xml.ws.BindingProvider.USERNAME_属性,config.getProperty(“myUser”);
requestContext.put(javax.xml.ws.BindingProvider.PASSWORD_属性,config.getProperty(“myPassword”);
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"/>
                </wsp:Policy>
            </sp:SupportingTokens>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>
service.setHandlerResolver(headerHandlerResolver);
endpoint = service.getPort(EFormsPortType.class);
endpoint = service.getPort(EFormsPortType.class);
Map<String, Object> requestContext = ((javax.xml.ws.BindingProvider) endpoint).getRequestContext();
requestContext.put(javax.xml.ws.BindingProvider.USERNAME_PROPERTY, config.getProperty("myUser");
requestContext.put(javax.xml.ws.BindingProvider.PASSWORD_PROPERTY, config.getProperty("myPassword");