环境:Jdk版本1.6.0_03(如果你使用Jdk7也许会非常顺利,因此在这里有必要把jdk版本说明下)
CXF版本2.1
说明:版本不同,引入的jar包也相应的有所不同
cxf简单例子
cxf java项目的目录结构以及jar包,如图
步骤:
1.接口HelloWorld.java
package com.demo;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(@WebParam(name="text")String text);
String sayHiToUser(User user);
String[] SayHiToUserList(List<User> userList);
}
2.实现HelloWorld接口,编写HelloWorldImpl.java
package com.demo;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.jws.WebService;
@WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")
public class HelloWorldImpl implements HelloWorld {
Map<Integer, User> users = new LinkedHashMap<Integer, User>();
public String sayHi(String text) {
return "Hello " + text;
}
public String sayHiToUser(User user) {
users.put(users.size()+1, user);
return "Hello "+ user.getName();
}
public String[] SayHiToUserList(List<User> userList) {
String[] result = new String[userList.size()];
int i=0;
for(User u:userList){
result[i] = "Hello " + u.getName();
i++;
}
return result;
}
}
3.编写bean
package com.demo;
public class User {
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
4.编写服务端用于启动服务
package com.demo;
import javax.xml.ws.Endpoint;
public class webServiceApp {
public static void main(String[] args) {
System.out.println(System.getProperty("java.endorsed.dirs"));
System.out.println("web service start");
HelloWorldImpl implementor= new HelloWorldImpl();
String address="http://localhost:9000/helloWorld";
Endpoint.publish(address, implementor);
System.out.println("web service started");
}
}
5.编写客户端用于测试
package com.demo;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class HelloWorldClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
svr.setServiceClass(HelloWorld.class);
svr.setAddress("http://localhost:9000/helloWorld");
HelloWorld hw = (HelloWorld) svr.create();//创建一个代理类
User user = new User();
user.setName("Tony");
user.setDescription("test");
System.out.println(hw.sayHiToUser(user));
}
}
problem:在第4步启动服务是会报如下错误
Exception in thread "main" java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader,
but this RI (from jar:file:/D:/eclipse4.4/workspace/CXFDemo/lib/jaxb-impl-2.1.6.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class)
needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader.(See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)
翻译:Exception in thread "main" java.lang.LinkageError: 正在从引导类加载器加载 JAXB 2.1 API, 但此 RI (来自jar:file:/E:/jinwork/cxf/WebContent/WEB-INF/lib/jaxb-impl-2.2.6.jar! /com/sun/xml/bind/v2/model/impl/ModelBuilder.class) 需要 2.2 API。请使用授权目录机制将 jaxb-api.jar 放在引导类加载器中。(请参阅 http://java.sun.com/j2se/1.6.0/docs/guide/standards/)
解决办法:
1.首先获取到endorsed目录。
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(System.getProperty("java.endorsed.dirs"));
}
}
输出:D:\software\jdk1.6\jre\lib\endorsed
2.找到相应位置,将apache-cxf-2.1\lib下的jaxb-api-2.1.jar文件放到D:\software\jdk1.6\jre\lib\endorsed目录下即可。如果没有endorsed目录,则手动建立该目录。