请帮我解决这个问题。
我正在编写一个java SOAP客户端来点击某个正在使用HTPPS&的第三方的SOAP服务。接受标题中的web-security。称为-hand的soap服务依次返回一个类对象。 我写了一个类,在调用服务的时候,我得到了以下异常。我试图将SOAP Envelop发送到服务&使用SOAP UI工具执行它&获得成功的回应。 我有点困惑,因为当我用我的JAVA SOAP客户端发送SOAP信封时,我遇到异常,同时使用SOAP UI工具运行相同的SOAP信封,我得到了成功的响应。
线程“主”AxisFault中的异常
faultCode:{http://schemas.xmlsoap.org/soap/envelope/}MustUnderstand
faultSubcode: faultString:不理解“MustUnderstand”标题:
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:
在org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:96)
在org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
在org.apache.axis.client.Call.invokeEngine(Call.java:2784)
在org.apache.axis.client.Call.invoke(Call.java:2767)
在org.apache.axis.client.Call.invoke(Call.java:1910)
在fibonacci.testing.TestService.main(TestService.java:92)
{http://xml.apache.org/axis/}hostname:localhost
不明白“MustUnderstand”标题:
在org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:96)
在org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
在org.apache.axis.client.Call.invokeEngine(Call.java:2784)
在org.apache.axis.client.Call.invoke(Call.java:2767)
在org.apache.axis.client.Call.invoke(Call.java:1910)
在fibonacci.testing.TestService.main(TestService.java:92)
答案 0 :(得分:0)
您可能已经检查了以下链接,特别是在Axis的上下文中讨论了mustUnderstand错误 http://wso2.org/library/tutorials/understand-famous-did-not-understand-mustunderstand-header-s-error
您是否已从代码中确认了整个SOAP信封,而SOAP使用的信封是否相同?在两种情况下,mustUnderstand都设置为1吗?
答案 1 :(得分:0)
我遇到了这个问题,我在工作中解决了这个问题...... 当server.xsdd
上没有安全处理程序时,会设置此类消息在我的例子中,xsdd实现是在轴1.4上构建的,使用java.rmi和javax.xml.rpc.Service
如果是这种情况,您将有2个xsdd用于服务器(ns声明服务)和deploy.xsdd用于其他呼叫设置。
首先我添加到我的ns:操作这引用了oasis安全性,之后我向我的服务添加了请求流
它应该是这样的
<ns1:service name="YOUR SERVICE"> <!-- wss_username_token_over_ssl --> <requestFlow> <handler type="java:org.apache.ws.axis.security.WSDoAllReceiver"> <parameter name="passwordCallbackClass" value=" YOUR PASSWORD HANDLER JAVA PATH LOCATION"/> <parameter name="action" value="UsernameToken"/> </handler> </requestFlow>
<ns1:operation name="YOUR OPERATION NAME"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
.... other declarations ... />
根据您要创建的安全级别,在您的passwordCallbackClassHandler中,您必须/或不验证用户和密码 处理程序应该是这样的
公共类PWCallback实现了CallbackHandler {
private static final byte[] key = {
(byte)0x31, (byte)0xfd, (byte)0xcb, (byte)0xda,
(byte)0xfb, (byte)0xcd, (byte)0x6b, (byte)0xa8,
(byte)0xe6, (byte)0x19, (byte)0xa7, (byte)0xbf,
(byte)0x51, (byte)0xf7, (byte)0xc7, (byte)0x3e,
(byte)0x80, (byte)0xae, (byte)0x98, (byte)0x51,
(byte)0xc8, (byte)0x51, (byte)0x34, (byte)0x04,
};
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
System.out.println("DENTROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO");
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof WSPasswordCallback) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
/*
* here call a function/method to lookup the password for
* the given identifier (e.g. a user name or keystore alias)
* e.g.: pc.setPassword(passStore.getPassword(pc.getIdentfifier))
* for testing we supply a fixed name/fixed key here.
*/
if (pc.getUsage() == WSPasswordCallback.KEY_NAME) {
pc.setKey(key);
}
else {
pc.setPassword("security");
}
} else {
throw new UnsupportedCallbackException(
callbacks[i], "Unrecognized Callback");
}
}
}
}
希望这对你有所帮助 问候