关于
Apache CXF
Apache CXF = Celtix + XFire
,
Apache CXF
的前身叫
Apache CeltiXfire
,现在已经正式更名为
Apache CXF
了,以下简称为
CXF
。
CXF
继承了
Celtix
和
XFire
两大开源项目的精华,提供了对
JAX-WS
全面的支持,并且提供了多种
Binding
、
DataBinding
、
Transport
以及各种
Format
的支持,并且可以根据实际项目的需要,采用代码优先(
Code First
)或者
WSDL
优先(
WSDL First
)来轻松地实现
Web Services
的发布和使用。目前它仍只是
Apache
的一个孵化项目。
Apache CXF
是一个开源的
Services
框架,
CXF
帮助您利用
Frontend
编程
API
来构建和开发
Services
,像
JAX-WS
。这些
Services
可以支持多种协议,比如:
SOAP
、
XML/HTTP
、
RESTful HTTP
或者
CORBA
,并且可以在多种传输协议上运行,比如:
HTTP
、
JMS
或者
JBI
,
CXF
大大简化了
Services
的创建,同时它继承了
XFire
传统,一样可以天然地和
Spring
进行无缝集成。
在
cxf
官网上下载最新
2.1.3
版本,所有的
jar
都在其
lib
目录下,
CXF
核心
jar
包括一下几个
:
- cxf.jar
- commons-logging.jar
- geronimo-activation.jar (Or the Sun
equivalent) [6]
- geronimo-annotation.jar (Or the Sun
equivalent) [6]
- geronimo-javamail.jar (Or the Sun
equivalent) [6]
- geronimo-stax-api.jar (Or the Sun
equivalent) [6]
- neethi.jar
- jaxb-api.jar
- jaxb-impl.jar
- XmlSchema.jar
- wstx-asl.jar
[6]
- wsdl4j.jar
- xml-resolver.jar
JAX-WS
支持
jar
包含以下几个
:
- geronimo-ws-metadata.jar [6]
- geronimo-jaxws_2.1_spec-1.0.jar (Or the
Sun equivalent) [6]
- saaj-api.jar [6]
- saaj-impl.jar [6]
- asm.jar (
这是一个可选包,主要功能是封装类型和对
jaxb
注解的支持,最好不用,因为他的版本可能跟
Spring
中提供的包冲突
)
以上
jar
是
cxf
发布
web
服务所必修的,其他的包依功能而定,用不到的包尽量不要用,否则在跟
web
项目做集成是会造成不必要的冲突。
发布一个简单的
web
服务的步骤
1
)建立一个
HelloWord
接口,其中接口类型和
map
需要建立
Adapter
,这样
jaxb
才可以支持,对于
List
,
string
及基本类型不用做适配处理。
package demo.hw.server;
import java.util.Map;
import javax.jws.WebService;
import
javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@WebService
public interface HelloWorld {
String sayHi(String text);
/* Advanced usecase of passing an Interface in.
JAX-WS/JAXB does not
* support interfaces directly.
Special XmlAdapter classes need to
* be written to handle them
*/
String sayHiToUser(User user);
/* Map passing
* JAXB also does not support Maps.
It handles Lists great, but Maps are
* not supported directly.
They
also require use of a XmlAdapter to map
* the maps into beans that JAXB can use.
*/
@XmlJavaTypeAdapter(IntegerUserMapAdapter.class)
Map<Integer, User> getUsers();
}
2
)
HelloWorld
接口实现类
package demo.hw.server;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.jws.WebService;
@WebService(endpointInterface =
"demo.hw.server.HelloWorld",
serviceName =
"HelloWorld")
public class HelloWorldImpl implements
HelloWorld {
Map<Integer, User> users = new LinkedHashMap<Integer,
User>();
public String sayHi(String text) {
System.out.println("sayHi called");
return "Hello " + text;
}
public String sayHiToUser(User user) {
System.out.println("sayHiToUser called");
users.put(users.size() + 1, user);
return "Hello "
+
user.getName();
}
public Map<Integer, User> getUsers() {
System.out.println("getUsers called");
return users;
}
}
3
)
User
对象的定义
package demo.hw.server;
import
javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlJavaTypeAdapter(UserAdapter.class)
//
表示与此接口对应的适配对
UserAdapter
public interface User {
String getName();
}
package demo.hw.server;
import javax.xml.bind.annotation.XmlType;
@XmlType(name = "User")
//
表示实用的类型名为
User
public class UserImpl implements User {
String name;
public UserImpl() {
}
public UserImpl(String s) {
name = s;
}
public String getName() {
return name;
}
public void setName(String s) {
name = s;
}
}
4
)
User
类型的适配器类
,继承
XmlAdapter
,重载
marshal
,
unmarshal
package demo.hw.server;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class UserAdapter extends
XmlAdapter<UserImpl, User> {
public UserImpl marshal(User v) throws Exception {
if (v instanceof UserImpl) {
return (UserImpl)v;
}
return new UserImpl(v.getName());
}
public User unmarshal(UserImpl v) throws Exception {
return v;
}
}
5
)对
Map
的适配器
package demo.hw.server;
import
javax.xml.bind.annotation.XmlAccessType;
import
javax.xml.bind.annotation.XmlAccessorType;
import
javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlType(name = "IntegerUserMap")
@XmlAccessorType(XmlAccessType.FIELD)
public class IntegerUserMap {
@XmlElement(nillable = false, name = "entry")
List<IntegerUserEntry> entries = new
ArrayList<IntegerUserEntry>();
public List<IntegerUserEntry> getEntries() {
return entries;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "IdentifiedUser")
static class IntegerUserEntry {
//Map keys cannot be null
@XmlElement(required = true, nillable = false)
Integer id;
User user;
public void setId(Integer k) {
id = k;
}
public Integer getId() {
return id;
}
public void setUser(User u) {
user = u;
}
public User getUser() {
return user;
}
}
}
package demo.hw.server;
import
javax.xml.bind.annotation.adapters.XmlAdapter;
public class IntegerUserMapAdapter extends
XmlAdapter<IntegerUserMap, Map<Integer, User>> {
public IntegerUserMap marshal(Map<Integer, User> v) throws
Exception {
IntegerUserMap map = new IntegerUserMap();
for (Map.Entry<Integer, User> e : v.entrySet()) {
IntegerUserMap.IntegerUserEntry iue = new
IntegerUserMap.IntegerUserEntry();
iue.setUser(e.getValue());
iue.setId(e.getKey());
map.getEntries().add(iue);
}
return map;
}
public Map<Integer, User> unmarshal(IntegerUserMap v) throws
Exception {
Map<Integer, User> map = new LinkedHashMap<Integer, User>();
for (IntegerUserMap.IntegerUserEntry e :
v.getEntries()) {
map.put(e.getId(), e.getUser());
}
return map;
}
}
6
)用
spring
配置
cxf
的
context
文件
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- Import Apache CXF Bean Definition -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import
resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:server id="jaxwsService"
serviceClass="demo.hw.server.HelloWorld"
address="/hello_world">
<jaxws:serviceBean>
<bean
class="demo.hw.server.HelloWorldImpl" />
</jaxws:serviceBean>
</jaxws:server>
</beans
>
7
)配置
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/cxfConfig.xml</param-value>
</context-param>
<!-- Spring ContextLoaderListener -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Apache CXFServlet -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- CXFServlet Mapping -->
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
加载配置文件,配置
cxf
的
servlet
,部署工程,启动
tomcat
,
输入
http://localhost:8080/工程名
一切
ok
,就是这么简单
分享到:
相关推荐
CXF+spring+struts实现WebService
cxf2.1.3开发所有的到的 所有包 很全的啊
cxf2.1.3开发所有的到的 所有包 很全的啊
CXF2.1.3开发包中的工具 为了方便我打成包 单发出来
测试 cxf 2.1.3客服端 调用 xfire 1.2.6 的服务端 的对象传递,与对象返回,服务端见xfire 1.2.6 server
apache-cxf-2.1.3.zip
Cxf2实例.................共35个实例
Cxf2.1.3API.................
依赖的包: commons-logging-1.1.jar geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar) geronimo-annotation_1.0_spec-1.1.jar (JSR 250) geronimo-javamail_1.4_spec-1.0-M1.jar...cxf-2.1.jar
apache cxf 2.1.3 的用户手册
1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 WebService CXF JAR以及相关包
cxf2.1.3 web项目Helloworld,在tomcat6.0可以跑,相关lib可以从cxf.apache.org下载.
非常流行的web service框架,与spring集成,非常简单。
使用 CXF 做 webservice 简单例子,用的是cxf-2.1.3.jar
NULL 博文链接:https://openstudy.iteye.com/blog/1048441
这个示例用到的cxf版本是2.1.3,包含了所用到的jar包,依赖了spring,引用的spring jar包请自行导入