soap消息的传递与处理(二)(基于payload的方式)

来源:互联网 发布:零基础学算法第三版dvd 编辑:程序博客网 时间:2024/09/21 09:20

首先创建一个User类:

package com.smile.service;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class User {private int id;private String username = "";private String nickname = "";private String password = "";public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User(){super();}public User(int id,String username,String nickname,String password){this.id = id;this.username = username;this.nickname = nickname;this.password = password;}}
然后修改IMyService.java增加三个方法:

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//下边这行注解在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);@WebResult(name="user")public List<User> list();}

完善MyServiceImpl.java:

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")public class MyServiceImpl implements IMyService {private static List<User> users = new ArrayList<User>(); public MyServiceImpl(){users.add(new User(1,"admin","管理员","111111"));}@Overridepublic int add(int a, int b) {return a+b;}@Overridepublic User addUser(User user) {users.add(user);return user;}@Overridepublic User login(String username, String password) {for(User user:users){if(user.getUsername().equals(username) && user.getPassword().equals(password)){return user;}}return null;}@Overridepublic List<User> list() {return users;}}
我们在TestSoap.java中增加第三种传递soap消息的方式:

@Testpublic void test3(){try {//创建服务(Service)URL url = new URL(wsdlUrl);QName sname = new QName(ns,"MyServiceImplService"); Service service = Service.create(url, sname);//创建Dispatch(通过源数据的方式传递)Dispatch<Source> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"),Source.class,Service.Mode.PAYLOAD);//根据用户创建相应的xmlUser user = new User(3,"zhangsan","张三","123456");JAXBContext ctx = JAXBContext.newInstance(User.class);Marshaller marshell = ctx.createMarshaller();//<user><id>3</id><nickname>张三</nickname><password>123456</password><username>zhangsan</username></user>marshell.setProperty(Marshaller.JAXB_FRAGMENT, true);//不加上边的属性//<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><id>3</id><nickname>张三</nickname><password>123456</password><username>zhangsan</username></user>StringWriter writer = new StringWriter();marshell.marshal(user, writer);//System.out.println(writer.toString());//封装相应的part addUserString payload = "<nn:addUser xmlns:nn = \""+ns+"\">"+writer.toString()+"</nn:addUser>";System.out.println(payload);StreamSource source = new StreamSource(new StringReader(payload));//通过dispatch传递payloadSource response = dispatch.invoke(source);//将返回结果转换为dom进行操作 通过transformer对象Transformer tran = TransformerFactory.newInstance().newTransformer();DOMResult result = new DOMResult();tran.transform(response, result);//处理相应信息(通过xpath)XPath xpath = XPathFactory.newInstance().newXPath();NodeList n1 = (NodeList)xpath.evaluate("//user", result.getNode(),XPathConstants.NODESET);System.out.println(n1);User ruser = (User)ctx.createUnmarshaller().unmarshal(n1.item(0));System.out.println(ruser.getNickname());} catch (Exception e) {e.printStackTrace();}}
从而实现了,通过payload传递封装soap消息传递。

0 0