当前位置: 首页 > 知识库问答 >
问题:

SOAP UI生成的JAVA客户端抛出MustUnderstandHeaders不被理解错误

元望
2023-03-14

这是我在这里的第一个帖子,所以请耐心等待。我有一个WSDL,我使用SOAP UI生成Java客户机。我将客户端插入到一个测试项目中,并正在使用客户端访问web服务。web服务需要安全头(它不是wsdl策略的一部分),所以我不得不使用处理程序来将安全头添加到创建的SOAP信封中。在运行我的程序时,它抛出以下错误...当我通过SOAP UI运行相同的SOAP请求时,它似乎处理得很好。我注意到的另一个有趣的事情是,尽管我在客户机中处理了相同的请求(包括security头的nonce)之后(抛出错误之后)在SOAP UI中运行了它,但它似乎仍然处理得很好。但是,当我尝试在SOAP UI中运行相同的请求两次时,它会抛出一个异常,这就意味着不能多次使用相同的Nonce值(这是预期的行为)。这使我认为在运行我的客户机后生成的错误甚至没有到达运行web服务的服务器,否则该临时事件将被缓存在那里,而我将无法在SOAP UI中运行它。我已经将处理程序类方法附加在错误块下面。我倾向于相信安全头是好的,因为消息在SOAP UI中处理得很好。感谢任何帮助。

javax.xml.ws.soap.soapFaultException:必须理解头:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wsssecurity-secext-1.0.xsd}安全性]在com.sun.xml.internal.ws.protocol.soap.mutube.createMusoapFaultException(未知源)在com.sun.xml.internal.ws.protocol.soap.clientmutube.processResponse(未知源)在com.sun.xml.internal.ws.api.pipe.fiber.__dorun(未知源)在com.sun.xml.internal.ws.api.pipe.fiber.__dorun(未知源)在._dorun(未知源)在com.sun.xml.internal.ws.api.pipe.fiber.dorun(未知源)在com.sun.xml.internal.ws.api.pipe.fiber.runsync(未知源)在com.sun.xml.internal.ws.client.stub.process(未知源)在com.sun.xml.internal.ws.client.sei.seistub.dorprocess(未知源)在com.sun.xml.internal.ws.client.sei.syncMethodHandler.invoke(未知源)在com.sun.xml.internal.ws.client.sei.syncMethodHandler.invoke(未知源)在com.sun.xml.internal.ws.client(未知源)在.sei.seistub.invoke(未知源)在com.sun.proxy.$proxy34。在com.douglas.client.client.main(client.java:50)上搜索人口统计学(来源不明)

公共布尔handleMessage(SOAPMessageContext smc){

    Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (outboundProperty.booleanValue()) {

        SOAPMessage message = smc.getMessage();


        try {
             //message.writeTo(System.out);
             //System.out.println("\n");
            String nonce = getNonce();
            String password1 = "password01";
            SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            String messageCrTime = ft.format(new Date());
            String passwordDigest = SHAsum(nonce, password1, messageCrTime);

            SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
            SOAPHeader header = envelope.addHeader();

            SOAPElement security =
                    header.addChildElement("Security", "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(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

            SOAPElement username =
                    usernameToken.addChildElement("Username", "wsse");
            username.addTextNode("USERNAME");

            SOAPElement password =
                    usernameToken.addChildElement("Password", "wsse");
            password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
           password.addTextNode(passwordDigest);

           SOAPElement nonceElem =
                   usernameToken.addChildElement("Nonce", "wsse");
           //password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
           nonceElem.addTextNode(Base64.encodeBytes(nonce.getBytes()));

           SOAPElement created =
                   usernameToken.addChildElement("Created", "wsu");
           //password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
           created.addTextNode(messageCrTime);

            //Print out the outbound SOAP message to System.out
            message.writeTo(System.out);
            System.out.println("");

        } catch (Exception e) {
            e.printStackTrace();
        }

    } else {
        try {

            //This handler does nothing with the response from the Web Service so
            //we just print out the SOAP message.
            SOAPMessage message = smc.getMessage();
            message.writeTo(System.out);
            System.out.println("");

        } catch (Exception ex) {
            ex.printStackTrace();
        } 
    }


    return outboundProperty;

}

共有1个答案

富昕
2023-03-14

找到了解决办法。客户端抛出这些错误的原因是,当它从web服务接收回响应时,mustUnderstand被设置为'1'。现在,由于WSDL策略不包括安全组件,客户机不知道如何使用它。解决方法是在HeaderHandler.java类中添加以下方法。

 public Set getHeaders() {
        final QName securityHeader = new QName(  
                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",  
                "Security", "wsse");  

        final HashSet<QName> headers = new HashSet<QName>();  
        headers.add(securityHeader);  
        return headers;  

        //throw new UnsupportedOperationException("Not supported yet.");
    }
 类似资料:
  • 嗯,首先,对不起我的英语不好。 “enderecodao.java”: 和ENDERECO的WebService“servicoEnderEco.java”:

  • 我有一个这样的歌剧API: OpenAPI生成器Maven的插件为schema对象创建了一个请求类“GenerateTokenRequest”,但在API实现类中它没有使用。它生成一个方法,将所有请求的字段作为参数列表。方法如下: 所以,在这种情况下,请求类“GenerateTokenRequest”被生成,但从未使用过。任何人都可以告诉我为什么?有一种使用我的请求类的替代方法吗?我可以在Open

  • 我需要在我的项目中使用一个web服务。我使用NetBeans所以我右键单击我的项目并尝试添加一个新的“Web服务客户端”。上次我检查时,这是创建web服务客户机的方法。但它导致一个AssertionError,它说: java.lang.AssertionError:org.xml.sax.SAXParseException;systemid:jar:file:/path/to/glassfish

  • 尝试在Eclipse中使用向导/web服务/web服务客户机从现有服务器生成web服务客户机时。Net Web服务的WSDL,我遇到了以下错误:“向导WSDL验证已禁用。”,向导无法继续返回主页,因为:找不到服务器,并且WebServiceProject不存在。选择现有项目或使用首选项配置服务器运行时。我能做些什么来解决这个问题?谢谢

  • 作为第一步,我使用了Quarkus Openapi指南:https://Quarkus.io/guides/openapi-swaggerui,但是在运行未修改的示例并通过http://localhost:8080/Openapi检索Openapi YAML-Data之后,我注意到生成的数据是错误的,并且Openapi生成器由于stackoverflow错误而无法生成客户端。 问题:SetFrui

  • 我希望当遇到错误时,用户会收到对其http调用的异常响应。该错误确实被捕获并显示在spring日志中,但不会返回给用户。为什么? 我的方法是: 日志中的错误: 错误处理程序: xception.java 例外回复。JAVA 用户收到403。。我不知道为什么,但我应该接受我的错误,没有任何身体。。 InternalServerExc0019在try/catch之外工作。.