Webservice_13_Payload的方式传递SOAP的消息和处理 和 用SOAPMes
发布时间:2020-12-17 00:11:52 所属栏目:安全 来源:网络整理
导读:传递实体类:User.java package cn.lichen.soap;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class User {private int id;private String username;private String nickname;private String password;public User() {}public Us
传递实体类:User.java package cn.lichen.soap; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class User { private int id; private String username; private String nickname; private String password; public User() { } public User(int id,String username,String nickname,String password) { this.id = id; this.username = username; this.nickname = nickname; this.password = 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; } }
接口:IMyService.java package cn.lichen.soap; import java.util.List; @WebService public interface IMyService { @WebResult(name="addResult") public int add(@WebParam(name="a")int a,@WebParam(name="b")int b); public int minus(int a,int b); @WebResult(name="user") public User addUser(@WebParam(name="user")User user); @WebResult(name="user") public List<User> getAllUser(); } ? 注意:在方法上添加@WebResult(name="user")之后,返回的结果自动指定为User对象。 ? 实现类:MyServiceImpl.java package cn.lichen.soap; import java.util.ArrayList; @WebService(endpointInterface="cn.lichen.soap.IMyService") public class MyServiceImpl implements IMyService { private static List<User> users = new ArrayList<User>(); public MyServiceImpl() { users.add(new User(1,"admin","管理员","123")); } @Override public int add(int a,int b) { System.out.println(a+"+"+b+"="+(a+b)); return (a+b); } @Override public int minus(int a,int b) { System.out.println(a+"-"+b+"="+(a-b)); return (a-b); } @Override public User addUser(User user) { users.add(user); return user; } @Override public List<User> getAllUser() { return users; } }
package cn.lichen.soap; import javax.xml.ws.Endpoint; public class MyService { public static void main(String[] args) { String address = "http://localhost:9999/ns"; Endpoint.publish(address,new MyServiceImpl()); } } ?
/** * @Title: test03 * @Description: 使用Payload传递消息和处理消息 * @param * @return void * @throws */ @Test public void test03() { try { // 创建访问wsdl服务的URL URL url = new URL("http://localhost:9999/ns?wsdl"); // 通过Qname指明服务的具体信息 QName name = new QName("http://soap.lichen.cn/","MyServiceImplService"); // 创建service Service service = Service.create(url,name); // 创建dispatch Dispatch<Source> dispatch = service.createDispatch(new QName( "http://soap.lichen.cn/","MyServiceImplPort"),Source.class,Service.Mode.PAYLOAD); //根据用户对象创建相应的xml User user = new User(2,"zs","张三","22222"); JAXBContext ctx = JAXBContext.newInstance(User.class); Marshaller mar = ctx.createMarshaller(); mar.setProperty(Marshaller.JAXB_FRAGMENT,true); StringWriter writer= new StringWriter(); mar.marshal(user,writer); //4、封装相应的part addUser String payload = "<nn:addUser xmlns:nn=""+"http://soap.lichen.cn/"+"">"+writer.toString()+"</nn:addUser>"; System.out.println(payload); StreamSource rs = new StreamSource(new StringReader(payload)); //5、通过dispatch传递payload Source response = (Source)dispatch.invoke(rs); //6、将Source转化为DOM进行操作,使用Transform对象转换 Transformer tran = TransformerFactory.newInstance().newTransformer(); DOMResult result = new DOMResult(); tran.transform(response,result); //7、处理相应信息(通过xpath处理) XPath xpath = XPathFactory.newInstance().newXPath(); NodeList nl = (NodeList)xpath.evaluate("//user",result.getNode(),XPathConstants.NODESET); User ru = (User)ctx.createUnmarshaller().unmarshal(nl.item(0)); System.out.println(ru.getNickname()); }catch (IOException e) { e.printStackTrace(); } catch (JAXBException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerFactoryConfigurationError e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } ? /** * @Title: test05 * @Description: 用SOAPMessage传递SOAP的消息和处理(无参数) * @param * @return void * @throws */ @Test public void test05() { try { // 创建访问wsdl服务的URL URL url = new URL("http://localhost:9999/ns?wsdl"); // 通过Qname指明服务的具体信息 QName name = new QName("http://soap.lichen.cn/",name); // 创建dispatch Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName( "http://soap.lichen.cn/",SOAPMessage.class,Service.Mode.MESSAGE); // 创建SOAPmessage SOAPMessage message = MessageFactory.newInstance().createMessage(); SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); SOAPBody body = envelope.getBody(); QName qname = new QName("http://soap.lichen.cn/","getAllUser","xsd"); @SuppressWarnings("unused") SOAPBodyElement bodyElement = body.addBodyElement(qname); // 输入创建SOAPmessage message.writeTo(System.out); System.out.println("nn" + "-----------invoking-------------" + "n"); // 传递消息并且得到结果 SOAPMessage responseMessage = dispatch.invoke(message); // 输出得到的SOAPmessage responseMessage.writeTo(System.out); // 将响应的消息转换为dom对象 Document doc = responseMessage.getSOAPBody() .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("n"+u.getNickname()); } } catch (SOAPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JAXBException e) { e.printStackTrace(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |