`
rock
  • 浏览: 56889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CXF2.1.3使用总结

阅读更多

 

关于 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 ,就是这么简单

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics