soap消息的传递和处理(三)——包含header和异常的处理

本文探讨了在SOAP消息传递中如何处理Header和异常。通过IMyService的修改,介绍了自定义的UserException,并展示了如何在SOAP消息中验证Header和处理异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于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();
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值