CXF SOAP转换成SOAP-ENV
时间: 2023-10-19 15:06:46 浏览: 85
CXF是一个Java框架,提供了SOAP Web服务的实现和消费。在CXF中,SOAP消息的默认格式是SOAP 1.2,即使用“http://www.w3.org/2003/05/soap-envelope”命名空间的SOAP消息。如果需要将SOAP消息转换成SOAP 1.1格式,即使用“http://schemas.xmlsoap.org/soap/envelope/”命名空间的SOAP消息,可以在CXF客户端中进行配置。
在CXF客户端中,可以通过设置客户端的BindingProvider的属性来指定SOAP消息的协议版本。例如,在使用JAX-WS API的CXF客户端中,可以使用以下代码将SOAP消息转换成SOAP 1.1格式:
```
HelloWorldService service = new HelloWorldService();
HelloWorld port = service.getHelloWorldPort();
BindingProvider bp = (BindingProvider) port;
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setSOAPVersion(SOAPBinding.SOAP11HTTP_BINDING);
```
这样,通过CXF客户端发送的SOAP消息就会使用SOAP 1.1协议,并使用“http://schemas.xmlsoap.org/soap/envelope/”命名空间。
相关问题
CXF SOAP:Header转换成SOAP-ENV:Header
在CXF中,可以通过使用拦截器来转换SOAP消息中的Header部分。具体步骤如下:
1. 创建一个继承自AbstractSoapInterceptor的拦截器类,并实现handleMessage方法。在handleMessage方法中,可以获取到SOAP消息中的Header部分,并进行转换操作。
例如:
```
public class HeaderInterceptor extends AbstractSoapInterceptor {
public HeaderInterceptor() {
super(Phase.PRE_PROTOCOL);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
// 获取SOAP消息中的Header部分
Header header = message.getHeader();
if (header != null) {
// 创建一个新的SOAPHeader对象
SOAPHeader soapHeader = message.getHeaders().get(0);
// 将Header对象中的所有子元素都添加到SOAPHeader对象中
for (Iterator<Header> iter = header.getHeaders(); iter.hasNext(); ) {
Header child = iter.next();
soapHeader.addChildElement(child.getName()).setValue(child.getValue());
}
// 将Header对象从SOAP消息中删除
message.getHeaders().remove(header);
}
}
}
```
2. 在CXF配置文件中,将拦截器添加到InInterceptors或OutInterceptors中,以便在接收或发送SOAP消息时执行转换操作。例如:
```
<jaxws:endpoint ...>
<jaxws:inInterceptors>
<bean class="com.example.HeaderInterceptor"/>
</jaxws:inInterceptors>
</jaxws:endpoint>
```
这样,当接收到一个SOAP消息时,HeaderInterceptor拦截器会将SOAP消息中的Header部分转换成SOAP-ENV:Header格式,并将其添加到SOAP消息的Header部分中。
使用Java提供的handler机制在客户端对SOAP请求包注入header。在实验一springboot框架下的CXF建立的web服务的基础上,对客户端产生的SOAP请求包加入header,header有一个子元素student,命名空间为你自己项目使用的命名空间;student有三个子元素sno和sname、time,即学号,姓名和当前系统时间。参考如下形式: <SOAP-ENV:Header> <student xmlns="http://hello.soapHandlerEx/"> <sno>001</sno> <sname>你的名字</sname> <time>2023/5/10</time> </student> </SOAP-ENV:Header> 输出方式可以采用命令行或文本记录。 2、在服务端对SOAP请求包进行解析,获得头部,并展示出头部的信息,展示方式可以自行设计。
1. 在客户端对SOAP请求包注入header
可以使用Java提供的SOAPHandler机制,在客户端请求WebService时,在SOAP消息头中添加指定的Header。
首先定义一个SOAPHandler实现类:
```java
package com.example.demo.handler;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class MySOAPHandler implements SOAPHandler<SOAPMessageContext> {
private static final String NAMESPACE_URI = "http://hello.soapHandlerEx/";
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutbound) {
try {
SOAPMessage soapMessage = context.getMessage();
SOAPEnvelope envelope = soapMessage.getSOAPPart().getEnvelope();
SOAPHeader header = envelope.getHeader();
if (header == null) {
header = envelope.addHeader();
}
SOAPElement studentElement = header.addChildElement(new QName(NAMESPACE_URI, "student"));
SOAPElement snoElement = studentElement.addChildElement("sno");
snoElement.setTextContent("001");
SOAPElement snameElement = studentElement.addChildElement("sname");
snameElement.setTextContent("你的名字");
SOAPElement timeElement = studentElement.addChildElement("time");
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
timeElement.setTextContent(now.format(formatter));
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return true;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
```
然后在客户端代码中添加Handler:
```java
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(HelloWorld.class);
factory.setAddress("http://localhost:8080/helloWorld");
factory.getHandlers().add(new MySOAPHandler());
HelloWorld helloWorld = (HelloWorld) factory.create();
String result = helloWorld.sayHello("World");
System.out.println(result);
```
这样,在请求WebService时,就会在SOAP消息头中添加指定的Header。
2. 在服务端对SOAP请求包进行解析
可以使用Java提供的SOAPHandler机制,在服务端接收到WebService请求时,从SOAP消息头中解析指定的Header。
首先定义一个SOAPHandler实现类:
```java
package com.example.demo.handler;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class MySOAPHandler implements SOAPHandler<SOAPMessageContext> {
private static final String NAMESPACE_URI = "http://hello.soapHandlerEx/";
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!isOutbound) {
try {
SOAPMessage soapMessage = context.getMessage();
SOAPEnvelope envelope = soapMessage.getSOAPPart().getEnvelope();
SOAPHeader header = envelope.getHeader();
if (header != null) {
SOAPElement studentElement = (SOAPElement) header.getElementsByTagNameNS(NAMESPACE_URI, "student").item(0);
if (studentElement != null) {
SOAPElement snoElement = (SOAPElement) studentElement.getElementsByTagName("sno").item(0);
String sno = snoElement.getTextContent();
SOAPElement snameElement = (SOAPElement) studentElement.getElementsByTagName("sname").item(0);
String sname = snameElement.getTextContent();
SOAPElement timeElement = (SOAPElement) studentElement.getElementsByTagName("time").item(0);
String time = timeElement.getTextContent();
System.out.println("SOAP Header: sno=" + sno + ", sname=" + sname + ", time=" + time);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return true;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
```
然后在服务端代码中添加Handler:
```java
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, new HelloWorldImpl());
endpoint.publish("/helloWorld");
endpoint.getBinding().getHandlerChain().add(new MySOAPHandler());
return endpoint;
}
```
这样,在接收到WebService请求时,就可以从SOAP消息头中解析指定的Header,并展示出来。
阅读全文