对于IMyService做如下修改:
package com.smile.service;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
/**
* @author Loach.Zhang
* SEI service Endpoint interface
*/
@WebService(targetNamespace="http://com.smile.ps.service/")
//下边这行注解在JDK1.6之前的版本中是需要的。升级到JDK1.7之后就可以不用这个注解
//在JDK1.6之前的版本中 对于int型的参数支持也是有问题的。升级到1.7之后就没有问题了。
//@SOAPBinding(style = SOAPBinding.Style.RPC,parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public interface IMyService {
@WebResult(name="addResult")
public int add(@WebParam(name="a")int a,@WebParam(name="b")int b);
@WebResult(name="user")
public User addUser(@WebParam(name="user")User user);
@WebResult(name="user")
public User login(@WebParam(name="username")String username,@WebParam(name="password")String password) throws UserException;
@WebResult(name="user")
public List<User> list();
@WebResult(name="user")
public List<User> listUser(@WebParam(header=true,name="authInfo")String authInfo);
// @WebResult(name="employees")
// public String getEmployees();
}
其中对login方法抛出自定义的异常UserException,新增加方法listUser参数增加authInfo同时表名是header信息。
自定义的UserException.java:
package com.smile.service;
public class UserException extends Exception{
public UserException() {
super();
}
public UserException(String message, Throwable cause,
boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(String message) {
super(message);
}
public UserException(Throwable cause) {
super(cause);
}
}
同时对MyServiceImpl做出如下修改:
package com.smile.service;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
/**
* @author Loach.Zhang SIB service implements bean
*
*/
@WebService(endpointInterface = "com.smile.service.IMyService",targetNamespace="http://com.smile.ps.service/")
public class MyServiceImpl implements IMyService {
private static List<User> users = new ArrayList<User>();
public MyServiceImpl() {
users.add(new User(1, "admin", "管理员", "111111"));
}
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public User addUser(User user) {
users.add(user);
return user;
}
@Override
public User login(String username, String password) throws UserException {
for (User user : users) {
if (user.getUsername().equals(username)
&& user.getPassword().equals(password)) {
return user;
}
}
throw new UserException("用户不存在");
}
@Override
public List<User> list() {
return users;
}
@Override
public List<User> listUser(String authInfo) {
System.out.println(authInfo);
return users;
}
}
执行具体的抛异常操作,对listUser方法打印传递进来的authInfo信息。
我们尝试发送SOAP消息来验证:
@Test
public void test4(){
try {
//创建服务(Service)
URL url = new URL(wsdlUrl);
QName sname = new QName(ns,"MyServiceImplService");
Service service = Service.create(url, sname);
//创建Dispatch
Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"),
SOAPMessage.class,Service.Mode.MESSAGE);
//创建消息工厂
MessageFactory factory = MessageFactory.newInstance();
//根据消息工厂创建SOAPMessage
SOAPMessage message = factory.createMessage();
//创建SOAPPart
SOAPPart part = message.getSOAPPart();
//获取SOAPEnvelope soap信封
SOAPEnvelope envelope = part.getEnvelope();
//可以通过SOAPEnvelope获取head body等信息
SOAPBody body = envelope.getBody();
//根据QName 创建相应的节点
QName ename = new QName(ns, "list", "ws");
SOAPBodyElement element = body.addBodyElement(ename);
//<ws:add xmlns="http://smile.web.com/webservice"/>
//使用以下方式设置< > 会被转义
// body.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
message.writeTo(System.out);
System.out.println("\t");
System.out.println("Invoking.....");
SOAPMessage response = dispatch.invoke(message);
response.writeTo(System.out);
Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
NodeList nl = doc.getElementsByTagName("user");
JAXBContext ctx = JAXBContext.newInstance(User.class);
for(int i = 0; i < nl.getLength(); i++){
Node n = nl.item(i);
User u = (User)ctx.createUnmarshaller().unmarshal(n);
System.out.println(u.getNickname());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test5(){
try {
//创建服务(Service)
URL url = new URL(wsdlUrl);
QName sname = new QName(ns,"MyServiceImplService");
Service service = Service.create(url, sname);
//创建Dispatch
Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"),
SOAPMessage.class,Service.Mode.MESSAGE);
//创建消息工厂
MessageFactory factory = MessageFactory.newInstance();
//根据消息工厂创建SOAPMessage
SOAPMessage message = factory.createMessage();
//创建SOAPPart
SOAPPart part = message.getSOAPPart();
//获取SOAPEnvelope soap信封
SOAPEnvelope envelope = part.getEnvelope();
//可以通过SOAPEnvelope获取head body等信息
SOAPBody body = envelope.getBody();
//创建head信息
SOAPHeader header = envelope.getHeader();
if(header == null){
header = envelope.addHeader();
}
QName hname = new QName(ns,"authInfo","ws");
header.addHeaderElement(hname).setValue("my name is zhangsan");
//根据QName 创建相应的节点
QName ename = new QName(ns, "listUser", "ws");
SOAPBodyElement element = body.addBodyElement(ename);
//<ws:add xmlns="http://smile.web.com/webservice"/>
//使用以下方式设置< > 会被转义
// body.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
message.writeTo(System.out);
System.out.println("\t");
System.out.println("Invoking.....");
SOAPMessage response = dispatch.invoke(message);
response.writeTo(System.out);
Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
NodeList nl = doc.getElementsByTagName("user");
JAXBContext ctx = JAXBContext.newInstance(User.class);
for(int i = 0; i < nl.getLength(); i++){
Node n = nl.item(i);
User u = (User)ctx.createUnmarshaller().unmarshal(n);
System.out.println(u.getNickname());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test6(){
try {
//创建服务(Service)
URL url = new URL(wsdlUrl);
QName sname = new QName(ns,"MyServiceImplService");
Service service = Service.create(url, sname);
//创建Dispatch
Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"),
SOAPMessage.class,Service.Mode.MESSAGE);
//创建消息工厂
MessageFactory factory = MessageFactory.newInstance();
//根据消息工厂创建SOAPMessage
SOAPMessage message = factory.createMessage();
//创建SOAPPart
SOAPPart part = message.getSOAPPart();
//获取SOAPEnvelope soap信封
SOAPEnvelope envelope = part.getEnvelope();
//可以通过SOAPEnvelope获取head body等信息
SOAPBody body = envelope.getBody();
//根据QName 创建相应的节点
QName ename = new QName(ns, "login", "ws");
//<ws:add xmlns="http://smile.web.com/webservice"/>
//使用以下方式设置< > 会被转义
// body.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
SOAPBodyElement element = body.addBodyElement(ename);
element.addChildElement("username").setValue("123");
element.addChildElement("password").setValue("123456");
message.writeTo(System.out);
System.out.println("\t");
System.out.println("Invoking.....");
SOAPMessage response = dispatch.invoke(message);
response.writeTo(System.out);
} catch (Exception e) {
e.printStackTrace();
}
}