项目中需要用到CXF做WS处理,花点时间对其有个简单认识,主要是在安全认证以及日志记录和异常处理这块有要求控制。
安全认证采用的是WSS4J,日志记录和异常处理采用拦截器控制,
资源下载:客户端和服务端都点这
服务端
整体架构.
至于webservice的配置可以参考其他文档,
服务接口
package com.cxfdemo.ws.service;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import com.cxfdemo.ws.service.model.Resume;
import com.cxfdemo.ws.service.model.User;
@WebService
public interface HelloWorld {
@WebResult(name = "String")
public String sayHi(@WebParam(name="text")String text);
@WebResult(name = "user")
public User getUser(@WebParam(name="id")String id);
public List<User> getAllUsers();
public void saveUser(@WebParam(name="id")String id,
@WebParam(name="name")String name,
@WebParam(name="sex")int sex);
/**
* 客户端的ObjectFactory的createUser方法的参数必须和User的构造函数的参数一致
* <p>
* 如客户端中需要用到new User("id","name",1)构造User对象时
*
* 需要在ObjectFactory中加入
* public User createUser(String id,String name,int sex) {
* return new User(id,name,sex);
* }
* </p>
* @param user
*/
public void saveUsers(@WebParam(name="user")User user);
@WebResult(name = "String")
public String saveResumes(@WebParam(name="resume")Resume resume);
}
服务实现
package com.cxfdemo.ws.service;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.activation.DataHandler;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlMimeType;
import com.cxfdemo.ws.service.model.Resume;
import com.cxfdemo.ws.service.model.User;
@WebService(endpointInterface="com.cxfdemo.ws.service.HelloWorld",
serviceName="HelloWorldServiceService",portName="HelloWorldServicePort",
name="HelloWorldService",targetNamespace="http://service.ws.cxfdemo.com/")
public class HelloWorldService implements HelloWorld{
public String sayHi(String text) {
return "Hello " + text;
}
public User getUser(String id) {
return new User("大王", id, 1);
}
public List<User> getAllUsers() {
List<User> list = new ArrayList<User>();
for (int i=0;i<4;i++) {
list.add(new User("小明"+i,""+i,i));
}
return list;
}
public void saveUser(String id, String name, int sex) {
System.out.println(new User(id, name, sex));
}
public void saveUsers(User user) {
System.out.println(user);
}
public String saveResumes(@XmlMimeType("application/octet-stream")Resume resume) {
if (resume == null) {
throw new NullPointerException("参数非法.");
}
DataHandler handler = resume.getDataHandler();
if (handler == null) {
throw new NullPointerException("参数非法.");
}
OutputStream os = null;
InputStream is = null;
try {
is = handler.getInputStream();
os = new FileOutputStream(new File("D:\\"
+ resume.getCandidateName() + "."
+ resume.getResumeFileType()));
byte[] b = new byte[100000];
int bytesRead = 0;
while ((bytesRead = is.read(b)) != -1) {
os.write(b, 0, bytesRead);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return "ok";
}
}
其中关于文件传输采用二进制方式.
有2点是必须配置的。