webservice一些笔记

Soap消息内容被封装为<soap:Envelope...SOAP信封,在信封之间的内容就是SOAP消息正文,这个元素还有一个子元素<soap:Header...,如果你的某些注解的header=true,那么它将被放到<soap:Header...中传输,而不是SOAP消息正文。

package com.nantian.service;
 
import javax.jws.WebParam;
import javax.jws.WebService;
 
@WebService
public interface HelloService {
Customer selectMaxAgeStudent(@WebParam(name="c1",header=true) Customer c1, Customer c2);  
Customer selectMaxLongNameStudent(Customer c1, Customer c2);  
}

 输入输出参数与@OneWay注解:

SOAP中方法的参数是有流向的,@WebParam的mode属性由javax.jws.WebParam.Mode枚举指定,表示参数的流向,默认是IN,也就是输入参数,还可以是OUT、INOUT类型。

如果是OUT、INOUT类型的参数类型,这样的方法参数将会被当做返回值在web服务调用完成后返回给你。客户端生成代码时会被转变为java.xml.ws.Holder<T>类型,注意不到导错包。

@javax.jws.OneWay注解是一个标识性注解,它表示公开的web服务的方法没有任何返回值,不允许有OUT类型的参数,不允许抛出非运行时异常,如果条件不符JAX-WS规范要求应该报告错误,但是CXF的策略是如果方法存在返回值,生成客户端时将被改为void;如果方法参数含有OUT类型,生成客户端时将被忽略;如果方法参数含有INOUT类型,生成客户端时将只作为IN类型参数被保留。

package com.nantian.service;

import javax.jws.WebParam;
import javax.jws.WebParam.Mode;
import javax.jws.WebService;
import javax.xml.ws.Holder;

@WebService
public interface HelloService {
	boolean selectMaxAgeStudent(@WebParam(name="c1") Customer c1,
			@WebParam(name="c2") Customer c2,
			@WebParam(name="c3",mode=Mode.OUT) Holder<Customer> c3);
	Customer selectMaxLongNameStudent(Customer c1, Customer c2);
}

 Web服务上下文:

javax.xml.ws.WebServiceContext接口用于在Web服务实现类中访问与服务请求有关的信息上下文和安全信息,只需要使用javax.annotation.Resource这个标准的注解标注即可使用这个接口。

这个接口的getMessageContext()方法返回javax.xml.ws.handlerMessageContext接口。

 

public void selectMaxAgeStudent(Customer c1, Customer c2, Holder<Customer> c3) {
		MessageContext mcontext = context.getMessageContext();
		Set<String> set = mcontext.keySet();
		for (String key : set) {
			System.out.println("*****************" + key + "\t" + mcontext.get(key));
			try {
				System.out.println("+++++++++++++++++" + key + "\t" + mcontext.getScope(key));
			} catch (Exception e) {
				System.out.println("+++++++++++++++++"+key+"不存在");
			}
		}
	}

 上面的方法会打印出消息上下文的所有属性集及其范围,因为getScope(String name)如果没有name存在会抛出异常。范围的可选值是javax.xml.ws.handler.MessageContextScope中的APPLICATIONHANDLER枚举。

 使用客户端视图:

服务端发布Web服务可以使用javax.xml.ws.Endpoint接口发布Web服务,这样在开发JAX-WS的服务端时完全避开使用底层实现的API,统一使用标准的JAX-WS的接口、注解等。也可以使用标准的JAX-WSAPI完成客户端调用。

package com.nantian.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

import com.nantian.service.HelloServiceImpl;
import com.nantian.service.HelloServiceImplService;

public class SOAPClientApi {

	public static void main(String[] args) throws MalformedURLException {
		QName qName = new QName("http://service.nantian.com/", "HelloServiceImplService");
		HelloServiceImplService helloServiceImplService = new HelloServiceImplService(
				new URL("http://10.11.13.83:8080/JAXWSdEMO/helloService?wsdl"), qName);
		HelloServiceImpl helloServiceImpl=helloServiceImplService.getPort(HelloServiceImpl.class);
	}
}

 首先使用Web服务的WSDL中的targetNamespace<wsdl:service...中的name属性构建了javax.xml.namespace.QName接口,然后调用生成的客户端代码中的客户端视图类(这个类继承javax.xml.ws.ServiceHelloServiceImplService的构造方法传入WSDLURLQName实例,在获得客户端视图实例之后调用T getPort(T t)这个泛型方法找到要使用的端点服务接口。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值