使用 Java 添加肥皂操作 Header
Adding Soap Action Header using Java
如何在 java 中添加肥皂操作 header。我在 Header 中使用 <a:Action s:mustUnderstand="1">MyServiceName</a:Action>
在 SoapUI 中测试了该服务,并且按照 post SOAP Action mismatch error while testing a WCF service with SoapUI 它工作正常。没有这个 header 我会得到 The SOAP action specified on the message, '', does not match the HTTP SOAP Action,
错误,这与我从 Java 客户端应用程序得到的错误相同。
PS:我使用 Apache CXF 从 wsdl 生成存根。我还尝试通过使用 wsimport 生成 java 客户端存根来使用 JAX-WS RI。使用这两种情况时出现相同的错误。
有什么想法吗?我在 SO 的 Java 中找不到解决此问题的正确结论 post。
这是我尝试过的方法,但我猜想使用 com.sun 中的 类... 不推荐使用包,这可能会导致不同 jdk 之间的可移植性问题。JAX-WS - Adding SOAP Headers
我遇到了类似的问题,这对我有用。我使用 wsimport 生成了 sei。
如果 header 是 wsdl 的一部分,您可以使用 -XadditionalHeaders 生成接受 header 的 SEI。
如果不是,则必须使用 SOAPHandler 以编程方式添加 header。虽然很简单!
这里有一个 link 有详细的描述。
http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client/
改方法,handleMessage如下
public boolean handleMessage(SOAPMessageContext smc) {
Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
SOAPMessage message = smc.getMessage();
try {
SOAPFactory soapFactory = SOAPFactory.newInstance();
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.addHeader();
SOAPHeaderElement se=header.addHeaderElement(new QName("http://schemas.microsoft.com/ws/2005/05/addressing/none", "Action"));
//se.setMustUnderstand(true); //Ideal way to set if webservice supports
se.addTextNode("some text");
se.addAttribute(soapFactory.createName("S:mustUnderstand"),"1"); //S: or s: depending on xmlns
} catch (Exception e) {
e.printStackTrace();
}
} else {
try {
SOAPMessage message = smc.getMessage();
message.writeTo(System.out);
System.out.println("");
} catch (Exception ex) {
ex.printStackTrace();
}
}
return true;
}
//附加处理程序的代码。
Service1 service1 = new Service1();
IService1 iService1 = service1.getBasicHttpBindingIService1();
BindingProvider bindingProvider = (BindingProvider) iService1;
final Binding binding = bindingProvider.getBinding();
List<Handler> handlerList = binding.getHandlerChain();
if (handlerList == null) {
handlerList = new ArrayList<Handler>();
}
handlerList.add(new HeaderHandler());
binding.setHandlerChain(handlerList);
ServiceResponse serviceResponse = iService1.callServiceMethod1(serviceRequest);
如何在 java 中添加肥皂操作 header。我在 Header 中使用 <a:Action s:mustUnderstand="1">MyServiceName</a:Action>
在 SoapUI 中测试了该服务,并且按照 post SOAP Action mismatch error while testing a WCF service with SoapUI 它工作正常。没有这个 header 我会得到 The SOAP action specified on the message, '', does not match the HTTP SOAP Action,
错误,这与我从 Java 客户端应用程序得到的错误相同。
PS:我使用 Apache CXF 从 wsdl 生成存根。我还尝试通过使用 wsimport 生成 java 客户端存根来使用 JAX-WS RI。使用这两种情况时出现相同的错误。
有什么想法吗?我在 SO 的 Java 中找不到解决此问题的正确结论 post。
这是我尝试过的方法,但我猜想使用 com.sun 中的 类... 不推荐使用包,这可能会导致不同 jdk 之间的可移植性问题。JAX-WS - Adding SOAP Headers
我遇到了类似的问题,这对我有用。我使用 wsimport 生成了 sei。
如果 header 是 wsdl 的一部分,您可以使用 -XadditionalHeaders 生成接受 header 的 SEI。
如果不是,则必须使用 SOAPHandler 以编程方式添加 header。虽然很简单!
这里有一个 link 有详细的描述。 http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client/
改方法,handleMessage如下
public boolean handleMessage(SOAPMessageContext smc) {
Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
SOAPMessage message = smc.getMessage();
try {
SOAPFactory soapFactory = SOAPFactory.newInstance();
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.addHeader();
SOAPHeaderElement se=header.addHeaderElement(new QName("http://schemas.microsoft.com/ws/2005/05/addressing/none", "Action"));
//se.setMustUnderstand(true); //Ideal way to set if webservice supports
se.addTextNode("some text");
se.addAttribute(soapFactory.createName("S:mustUnderstand"),"1"); //S: or s: depending on xmlns
} catch (Exception e) {
e.printStackTrace();
}
} else {
try {
SOAPMessage message = smc.getMessage();
message.writeTo(System.out);
System.out.println("");
} catch (Exception ex) {
ex.printStackTrace();
}
}
return true;
}
//附加处理程序的代码。
Service1 service1 = new Service1();
IService1 iService1 = service1.getBasicHttpBindingIService1();
BindingProvider bindingProvider = (BindingProvider) iService1;
final Binding binding = bindingProvider.getBinding();
List<Handler> handlerList = binding.getHandlerChain();
if (handlerList == null) {
handlerList = new ArrayList<Handler>();
}
handlerList.add(new HeaderHandler());
binding.setHandlerChain(handlerList);
ServiceResponse serviceResponse = iService1.callServiceMethod1(serviceRequest);