实验一创建基于Apache CXF的web service,命名为CXFof****,其中星号部分用姓名的拼音取代(姓写全拼,名写首字母,如CXFofSongW)。该服务有一个方法string CXFHello**(string),其中星号部分用姓名取代(编码规则同上),该方法接收学号string作为输入,输出个人的基本信息string,如学院,班级,姓名,籍贯。使用Java提供的handler机制在客户端对SOAP请求包注入header。在实验一建立的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请求包进行解析,获得头部,并展示出头部的信息,展示方式可以自行设计。
时间: 2024-04-01 19:36:59 浏览: 185
好的,您的问题是如何创建基于Apache CXF的web service并实现带有header的SOAP请求包注入和解析。
首先,您需要安装Apache CXF,并创建一个Maven项目,然后在pom.xml文件中添加CXF依赖项。
接下来,您需要在项目中创建一个Java接口,该接口将定义您的服务方法。以下是一个示例:
```java
package com.example.cxf;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface CXFofSongW {
@WebMethod
String CXFHelloSongW(String sno);
}
```
然后,您需要实现该接口并将其发布为web service。以下是一个示例:
```java
package com.example.cxf;
import javax.jws.WebService;
@WebService(endpointInterface = "com.example.cxf.CXFofSongW")
public class CXFofSongWImpl implements CXFofSongW {
@Override
public String CXFHelloSongW(String sno) {
// 在这里实现您的逻辑,返回个人基本信息
return "学院:计算机科学与技术,班级:2019级1班,姓名:张三,籍贯:北京";
}
}
```
接下来,您需要实现一个handler,用于在客户端对SOAP请求包注入header。以下是一个示例:
```java
package com.example.cxf;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
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 CXFHeaderHandler implements SOAPHandler<SOAPMessageContext> {
private static final String NAMESPACE = "http://hello.soapHandlerEx/";
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutbound) { // 在客户端对SOAP请求包注入header
try {
SOAPMessage message = context.getMessage();
SOAPHeader header = message.getSOAPHeader();
if (header == null) {
header = message.getSOAPPart().getEnvelope().addHeader();
}
QName studentQName = new QName(NAMESPACE, "student", "soap");
QName snoQName = new QName(NAMESPACE, "sno", "soap");
QName snameQName = new QName(NAMESPACE, "sname", "soap");
QName timeQName = new QName(NAMESPACE, "time", "soap");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDateTime now = LocalDateTime.now();
header.addChildElement(studentQName)
.addChildElement(snoQName).setValue("001")
.getParentElement().addChildElement(snameQName).setValue("张三")
.getParentElement().addChildElement(timeQName).setValue(now.format(formatter));
message.saveChanges();
} catch (SOAPException 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;
}
}
```
最后,您需要在web service端实现对SOAP请求包头部的解析。以下是一个示例:
```java
package com.example.cxf;
import java.util.Iterator;
import javax.xml.namespace.QName;
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 CXFHeaderHandlerServer implements SOAPHandler<SOAPMessageContext> {
private static final String NAMESPACE = "http://hello.soapHandlerEx/";
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!isOutbound) { // 在服务端对SOAP请求包进行解析,获得头部,并展示出头部的信息
try {
SOAPMessage message = context.getMessage();
SOAPHeader header = message.getSOAPHeader();
if (header != null) {
Iterator<?> it = header.getChildElements(new QName(NAMESPACE, "student", "soap"));
if (it.hasNext()) {
SOAPHeader studentHeader = (SOAPHeader) it.next();
String sno = studentHeader.getElementsByTagNameNS(NAMESPACE, "sno").item(0).getTextContent();
String sname = studentHeader.getElementsByTagNameNS(NAMESPACE, "sname").item(0).getTextContent();
String time = studentHeader.getElementsByTagNameNS(NAMESPACE, "time").item(0).getTextContent();
System.out.println("学号:" + sno);
System.out.println("姓名:" + sname);
System.out.println("时间:" + 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;
}
}
```
在您的web service实现类中添加注解@WebService和@HandlerChain,并指定handler类,如下所示:
```java
package com.example.cxf;
import javax.jws.HandlerChain;
import javax.jws.WebService;
@WebService(endpointInterface = "com.example.cxf.CXFofSongW")
@HandlerChain(file = "handler-chain.xml")
public class CXFofSongWImpl implements CXFofSongW {
@Override
public String CXFHelloSongW(String sno) {
// 在这里实现您的逻辑,返回个人基本信息
return "学院:计算机科学与技术,班级:2019级1班,姓名:张三,籍贯:北京";
}
}
```
最后,创建一个handler-chain.xml文件,指定handler的顺序,如下所示:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/handler-chains_1_0.xsd">
<handler-chain>
<handler>
<handler-name>CXFHeaderHandler</handler-name>
<handler-class>com.example.cxf.CXFHeaderHandler</handler-class>
</handler>
<handler>
<handler-name>CXFHeaderHandlerServer</handler-name>
<handler-class>com.example.cxf.CXFHeaderHandlerServer</handler-class>
</handler>
</handler-chain>
</handler-chains>
```
现在,您已经成功创建了基于Apache CXF的web service,并实现了带有header的SOAP请求包注入和解析。
阅读全文