使用Spring+CXF快速开发WebService

5星 · 超过95%的资源 需积分: 3 4 下载量 34 浏览量 更新于2024-09-15 收藏 75KB DOC 举报
"这篇文档主要介绍了如何利用Spring与Apache CXF框架来开发Web服务,包括创建和消费Web服务。CXF提供了与Spring的便捷集成,允许通过注解或Spring的XML配置来定义Web服务。主要涉及到的关键注解有:@WebService、@SOAPBinding、@WebMethod、@WebParam和@WebResult,它们在构建WSDL文档和定义操作细节中起到关键作用。" Apache CXF是一个开源的Java框架,它支持多种Web服务标准,如SOAP、RESTful、WS-*等,并且与Spring框架深度整合,简化了Web服务的开发流程。在Spring环境中,CXF可以帮助开发者快速地暴露和消费Web服务。 1. @WebService 注解:这是定义一个Web服务的基础,用于标记接口或者类,其`name`、`serviceName`和`targetNamespace`属性分别对应于WSDL文档中的`wsdl:portType`、`wsdl:service`和`targetNamespace`元素,从而定义了Web服务的基本信息。 2. @SOAPBinding 注解:这个注解用来指定SOAP消息的格式和传输协议,比如SOAP 1.1或SOAP 1.2,以及是否采用RPC样式(RPC-literal或document-literal)。 3. @WebMethod 注解:用于标记Web服务的具体操作,其`operationName`属性定义了WSDL文档中的`wsdl:operation`名称,同时,该注解还可以用于设置SOAPAction头,这对于某些SOAP 1.1规范的约束是必要的。 4. @WebParam 注解:用于标记接口方法参数,`partName`属性定义了WSDL文档中`wsdl:part`的名称,这样可以明确参数在SOAP消息中的位置和角色。 5. @WebResult 注解:用于标记返回值,其`partName`属性定义了WSDL文档中用于表示返回结果的`wsdl:part`,帮助定义返回数据的结构。 例如,以下是一个简单的使用CXF和注解定义的UserService接口: ```java import java.util.List; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import com.cxf.pojo.User; @WebService(targetNamespace = "http://jdk.study.hermit.org/client") public interface UserService { @WebMethod(operationName = "Insert") public void insert(@WebParam(name = "user") User user); } ``` 在这个例子中,UserService接口定义了一个名为"Insert"的操作,接受一个User对象作为参数,而没有返回值。`@WebService`注解指定了服务的目标命名空间,`@WebMethod`注解定义了操作名称,`@WebParam`注解则用于指定参数的名称。 通过这样的注解方式,开发者可以在不编写任何额外配置文件的情况下,快速创建符合WSDL规范的Web服务。同时,Spring的集成使得这些服务可以无缝地与其他Spring应用组件交互,例如,可以方便地注入到其他服务或者由Spring管理的bean中。此外,CXF还支持动态客户端,允许在运行时动态生成客户端代理,进一步简化了消费Web服务的过程。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.xml.ws.Endpoint]: Factory method 'endpoint' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/cxf/frontend/ServerFactoryBean at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE] ... 19 common frames omitted Caused by: java.lang.NoClassDefFoundError: org/apache/cxf/frontend/ServerFactoryBean at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_301] at java.lang.ClassLoader.defineClass(ClassLoader.java:756) ~[na:1.8.0_301] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_301] at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) ~[na:1.8.0_301] at java.net.URLClassLoader.access$100(URLClassLoader.java:74) ~[na:1.8.0_301] at java.net.URLClassLoader$1.run(URLClassLoader.java:369) ~[na:1.8.0_301] at java.net.URLClassLoader$1.run(URLClassLoader.java:363) ~[na:1.8.0_301] at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_301] at java.net.URLClassLoader.findClass(URLClassLoader.java:362) ~[na:1.8.0_301] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_301] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[na:1.8.0_301] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_301] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:164) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:157) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:171) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4] at org.apache.cxf.jaxws.EndpointImpl.<init>(EndpointImpl.java:178) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4]

2023-06-07 上传