加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

JAX-WS 的简单使用

发布时间:2020-12-16 23:01:16 所属栏目:安全 来源:网络整理
导读:1、定义Service Jax-ws 的 WebService 定义是通过注解进行的,我们必须在其 WebService 类的接口上使用 @WebService 注解进行标记 @WebService@SOAPBinding(style = SOAPBinding.Style.RPC)public interface IWebService {@WebMethodpublic void calData(@We

1、定义Service

Jax-wsWebService定义是通过注解进行的,我们必须在其WebService类的接口上使用@WebService注解进行标记

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface IWebService {

	@WebMethod
	public void calData(@WebParam(name = "num") int num);

	@WebMethod
	public String getString(@WebParam(name = "message") String message);
}

@WebService的其它注解属性可以获取默认值,@WebParam 可以使XML生成的参数名更直观,此处加了@WebParam之后,在客户端写接口的时候也需要加上。

实现webService的接口:

@WebService(endpointInterface = "test.interfaces.IWebService")
public class WebServiceImpl implements IWebService {

	@Override
	public void calData(int num) {
		int data = 0;
		for (int i = 0; i < num + 1; i++) {
			data = num + data;
		}
		System.err.println("运行结果为  " + data);

	}

	@Override
	public String getString(String message) {
		if (message == null || "".equals(message)) {
			return null;
		} else {
			return "the message is :" + message;
		}
	}
}
实现类中需要指定实现接口的路径 @WebService(endpointInterface = "test.interfaces.IWebService")

2、服务端发布WebService

	private final static String ADDRESS = "http://127.0.0.1:8899/test/webservice";

	public static void main(String[] args) {

		IWebService service = new WebServiceImpl();
		Endpoint.publish(ADDRESS,service);
	}

发布完之后访问路径 http://127.0.0.1:8899/test/webservice?wsdl,可以看到
       <definitions targetNamespace="http://impl.test/" name="WebServiceImplService">
?? ??? ??? ?<import namespace="http://interfaces.test/"
?? ??? ??? ??? ?location="http://127.0.0.1:8899/test/webservice?wsdl=1" />
?? ??? ??? ?<binding name="WebServiceImplPortBinding" type="ns1:IWebService">
?? ??? ??? ??? ?<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
?? ??? ??? ??? ??? ?style="rpc" />
?? ??? ??? ??? ?<operation name="getString">
?? ??? ??? ??? ??? ?<soap:operation soapAction="" />
?? ??? ??? ??? ??? ?<input>
?? ??? ??? ??? ??? ??? ?<soap:body use="literal" namespace="http://interfaces.test/" />
?? ??? ??? ??? ??? ?</input>
?? ??? ??? ??? ??? ?<output>
?? ??? ??? ??? ??? ??? ?<soap:body use="literal" namespace="http://interfaces.test/" />
?? ??? ??? ??? ??? ?</output>
?? ??? ??? ??? ?</operation>
?? ??? ??? ??? ?<operation name="calData">
?? ??? ??? ??? ??? ?<soap:operation soapAction="" />
?? ??? ??? ??? ??? ?<input>
?? ??? ??? ??? ??? ??? ?<soap:body use="literal" namespace="http://interfaces.test/" />
?? ??? ??? ??? ??? ?</input>
?? ??? ??? ??? ??? ?<output>
?? ??? ??? ??? ??? ??? ?<soap:body use="literal" namespace="http://interfaces.test/" />
?? ??? ??? ??? ??? ?</output>
?? ??? ??? ??? ?</operation>
?? ??? ??? ?</binding>
?? ??? ??? ?<service name="WebServiceImplService">
?? ??? ??? ??? ?<port name="WebServiceImplPort" binding="tns:WebServiceImplPortBinding">
?? ??? ??? ??? ??? ?<soap:address location="http://127.0.0.1:8899/test/webservice" />
?? ??? ??? ??? ?</port>
?? ??? ??? ?</service>
?? ??? ?</definitions>
因为是实现的接口,所以继续访问http://127.0.0.1:8899/test/webservice?wsdl=1,可以看到具体的方法和方法的参数
?
 ?? ???? <definitions targetNamespace="http://interfaces.test/">
?? ??? ??? ?<types />
?? ??? ??? ?<message name="getString">
?? ??? ??? ??? ?<part name="message" type="xsd:string" />
?? ??? ??? ?</message>
?? ??? ??? ?<message name="getStringResponse">
?? ??? ??? ??? ?<part name="return" type="xsd:string" />
?? ??? ??? ?</message>
?? ??? ??? ?<message name="calData">
?? ??? ??? ??? ?<part name="num" type="xsd:int" />
?? ??? ??? ?</message>
?? ??? ??? ?<message name="calDataResponse" />
?? ??? ??? ?<portType name="IWebService">
?? ??? ??? ??? ?<operation name="getString" parameterOrder="message">
?? ??? ??? ??? ??? ?<input message="tns:getString" />
?? ??? ??? ??? ??? ?<output message="tns:getStringResponse" />
?? ??? ??? ??? ?</operation>
?? ??? ??? ??? ?<operation name="calData" parameterOrder="num">
?? ??? ??? ??? ??? ?<input message="tns:calData" />
?? ??? ??? ??? ??? ?<output message="tns:calDataResponse" />
?? ??? ??? ??? ?</operation>
?? ??? ??? ?</portType>
?? ??? ?</definitions>

3、客户端访问WebService

? 对于非本服务访问该WebService,需要重新定义一个接口,此处注解的@WebService 需要指定 targetNamespace,为http://127.0.0.1:8899/test/webservice?wsdl=1中生成的XML的targetNamespacetargetNamespace也可以在服务端指定;

@WebService(targetNamespace = "http://interfaces.test/")
public interface ILocalWebService {

	@WebMethod
	public void calData(@WebParam(name = "num") int num);

	@WebMethod
	public String getString(@WebParam(name = "message") String message);

}
?在使用Jax-ws时我们可以通过JaxWsProxyFactoryBean来访问服务
	public static void main(String[] args) {
		JaxWsProxyFactoryBean jwpFactory = new JaxWsProxyFactoryBean();
		jwpFactory.setAddress("http://127.0.0.1:8899/test/webservice?wsdl");
		jwpFactory.setServiceClass(ILocalWebService.class);
		ILocalWebService hw = (ILocalWebService) jwpFactory.create();
		hw.calData(29);
	}

? 也可以使用Service来访问服务

??? public static void main(String[] args) {
?? ??? ?try {
?? ??? ??? ?URL url= new URL("http://127.0.0.1:8899/test/webservice?wsdl");
?? ??? ??? ?// Qname qname是qualified name 的简写
?? ??? ??? ?// 2.构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成
?? ??? ??? ?// 由发布的wsdl可知namespace为? http://impl.test/
?? ??? ??? ?QName sname = new QName("http://impl.test/","WebServiceImplService");
?? ??? ??? ?Service service = Service.create(url,sname);
?? ??? ??? ?// 获取Service对应的port,从wsdl中获取的
?? ??? ??? ?QName pname = new QName("http://impl.test/","WebServiceImplPort");
?? ??? ??? ?ILocalWebService pservice = service.getPort(pname,ILocalWebService.class);
?? ??? ??? ?pservice.calData(29);
?? ??? ?} catch (MalformedURLException e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ?}

4、异常处理

?(1)、服务端发布WebService时报错 runtime modeler error: Wrapper class test.interfaces.jaxws.GetString is not found. Have you run APT to generate them?

?? 需要在WebService注解下加上 @SOAPBinding(style = SOAPBinding.Style.RPC)

?(2)、客户端访问WebService时报错 java.lang.NoClassDefFoundError: org/apache/ws/commons/schema/utils/NamespacePrefixList

??? 客户端使用 JaxWsProxyFactoryBean 访问远程WebService时,需要添加额外的jar包,XmlSchema-1.4.7.jar和 wsdl4j-1.6.2.jar。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读