1、创建基于Apache CXF的web service
1、创建基于Apache CXF的web service,命名为CXFof****,其中星号部分用姓名的拼音取代(姓写全拼,名写首字母,如CXFofSongW)。该服务有一个方法string CXFHello**(string),其中星号部分用姓名取代(编码规则同上),该方法接收学号string作为输入,输出个人的基本信息string,如学院,班级,姓名,籍贯。
项目结构:
项目结构截图显示 | 项目结构说明 此实验创建了一个名为SHIYAN1CXFWS的项目,项目中有两个模块,一个是SHIYAN1CXFWS_SER用于模拟CXF实现的服务端,而另一个是SHIYAN1CXFWS_CLI是模拟CXF实现的客户端,服务端有CXFOfHeYS接口,用于实现对外发布,CXFOfHeYSImpl是发布接口的实现类,用于模拟的数据库,通常这些数据会存储在数据库或其他持久化存储中,然后提供方法实现查找数据; StudentInfo是学生信息类;TestServer是用于服务端的测试;客户端有CXFOfHeYS接口,里面有一个向服务端发送请求的方法,TestClient类是用于客户端测试。 |
实现代码及截图:
实现代码 服务端: CXFOfHeYS接口: CXFOfHeYSImpl实现类: StudentInfo类: TestServer类: | 截图显示 CXFOfHeYS接口:标注了@WebService注解,表示这是一个WebService的服务接口,其定义了一个方法CXFHelloHeYS,该方法接收一个学生ID作为参数,并返回对应学生信息的字符串。 CXFOfHeYSImpl类:实现了CXFOfHeYS接口,并提供了方法CXFHelloHeYS的具体实现,它使用一个静态的Map来模拟一个学生信息的数据库,当调用CXFHelloHeYS方法时,它会根据传入的学生ID在数据库中查找对应的学生信息,然后返回学生信息的字符串表示。 TestServer类:包含了main方法,用于启动WebService服务端。使用JaxWsServerFactoryBean创建一个WebService服务端,设置了服务地址为http://localhost:8080/ws/hello,将CXFOfHeYSImpl作为服务类型,并将其设置为服务的实现类,最后,通过调用factory.create()方法来发布服务。 StudentInfo类:表示学生的基本信息,包括姓名、学院、班级和家乡,包含了一个构造方法和一些获取属性的方法。 |
2、服务的部署和配置
截图:
|
对截图内容的文字说明:
这是Maven项目的pom.xml文件, 依赖部分(<dependencies>): 第一个依赖声明了Apache CXF框架的cxf-rt-frontend-jaxws模块,版本为3.0.1。这是CXF框架的JAX-WS前端模块,用于支持JAX-WS标准的Web服务。 第二个依赖声明了Apache CXF框架的cxf-rt-transports-http-jetty模块,版本也是3.0.1。这是CXF框架的HTTP传输模块,使用Jetty作为HTTP服务器。 第三个依赖声明了SLF4J的slf4j-log4j12模块,版本为1.7.12。SLF4J是一个简单日志门面,该模块将日志消息传递给Log4j 1.2。 最后一个依赖声明了JUnit的junit模块,版本为3.8.1。这是一个单元测试框架,在这里被设置为测试范围,意味着它只在测试时才会被使用。 构建配置部分(<build>):,maven-compiler-plugin插件被配置为版本3.2。 |
3、在浏览器中查看该Web服务的描述文档
截图:
![]() |
结合自己编写的web服务,说明该服务的WSDL文档中各元素与服务之间的对应关系。
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/":引入了SOAP命名空间,用于定义SOAP协议相关的元素。 name="CXFOfHeYSImplService":定义了服务的名称。 targetNamespace="http://heys.com/":定义了服务的目标命名空间。 <xs:schema>:定义了XML Schema的命名空间和目标命名空间,并指定了元素的默认命名空间。 在该schema中定义了两个复杂类型(complexType):CXFHelloHeYS 和 CXFHelloHeYSResponse,以及它们的元素。 <wsdl:message>:定义了消息,即传输的数据结构。 name="CXFHelloHeYS" 和 name="CXFHelloHeYSResponse":定义了两个消息,分别用于请求和响应。 <wsdl:portType>:定义了端口类型,即服务所支持的操作。 name="CXFOfHeYS":定义了一个端口类型,其中包含一个操作 CXFHelloHeYS。 <wsdl:binding>:定义了绑定,即服务操作与消息格式和协议之间的映射关系。 name="CXFOfHeYSImplServiceSoapBinding":定义了一个绑定,指定了SOAP协议和HTTP传输。 在该绑定中,定义了操作 CXFHelloHeYS 的输入和输出消息的SOAP绑定。 <wsdl:service>:定义了服务的实现。 name="CXFOfHeYSImplService":定义了服务的名称。 <wsdl:port>:定义了服务的端口,即服务的具体实现细节。 binding="tns:CXFOfHeYSImplServiceSoapBinding":指定了绑定的名称,即之前定义的 CXFOfHeYSImplServiceSoapBinding。 name="CXFOfHeYSImplPort":定义了端口的名称。 <soap:address>:指定了服务的实际访问地址。 location="http://localhost:8080/ws/hello":定义了服务的URL地址,即该服务的访问入口。 |
4、创建客户端
截图:
CXFOfHeYS接口: 客户端的测试类: |
对截图内容的文字说明:
TestClient 类:包含了一个 main 方法,是程序的入口点。 首先,创建了一个 JaxWsProxyFactoryBean 对象,用于创建代理工厂,以便创建服务代理。 然后,设置了服务的地址为 http://localhost:8080/ws/hello,这是服务端提供的Web服务地址。接着,指定了服务接口为 CXFOfHeYS.class,这是一个接口,定义了客户端可以调用的服务方法,之后,通过工厂对象创建了服务代理 CXFOfHeYS。最后,调用了服务代理的 CXFHelloHeYS 方法,传入了一个学生ID参数,并将返回的结果打印出来。 CXFOfHeYS 接口:使用了 @WebService 注解,表示这是一个Web服务接口,定义了一个方法 CXFHelloHeYS,该方法接收一个学生ID参数,并返回一个字符串作为服务端的响应。 |
-
实验中出现的问题及解决方案
1.没运行服务器直接运行了客户端而报错,先运行服务器再运行客户端问题得以解决,服务器应全程运行。
2.在做CXF实现webservice实验的时候在运行客户端的时候会出现CXF javax.xml.ws.soap.SOAPFaultException: Unexpected wrapper element,查资料后得知出现此异常是由于客户端接口包名称是否与服务端的接口包名称不一致,将其与服务端的接口包名称统一即可解决此问题。