【JavaEE】经典JAVA EE企业应用实战-读书笔记20

来源:互联网 发布:网线接入网络方式 编辑:程序博客网 时间:2024/05/17 22:52

@WebMethod用于修饰EJB Bean实现类的方法

使用该注解的最常用功能是将Bean实现类中某个方法排除在WebService之外。如果不使用该注解修饰,在默认情况下,EJB容器会将Bean实现类中所有方法暴露成WebService

WebService经常与SOA一起被提起,SOAService Orient Architecture,也就是面向服务的结构,而WebService通常被作为SOA的实现技术。WebService负责把底层多个细粒度的方法进行包装、组合,然后包装成粗粒度的服务对外提供。SOA应用内部以低耦合、面向服务的方式进行通信,这就是SOA的基本思想。

属性说明

1)exclude,非必须,指定是否将该方法排除在WebService之外

2)action,非必须,指定WSDL中的SOAPAction,默认为空

3)operationName,非必须,指定该WebService操作的名称,默认与方法名相同

@Stateless@WebService(name = "person",         serviceName = "personWS",         portName = "personPort",         targetNamespace = "http://www.kingdz.org")public class PersonServiceBean implements PerspmService {@Override@WebMethod(operationName = "sayHello", action = "http://www.kingdz.org/greet")public String hello(String name, String age) {return name + age;}@Override@WebMethod(exclude = true)public long test() {return Math.round(Math.random() * 100);}}

部署后的部分WSDL

 <portType name='person'>  <operation name='sayHello' parameterOrder='sayHello'>   <input message='tns:person_sayHello'></input>   <output message='tns:person_sayHelloResponse'></output>  </operation> </portType> <binding name='personBinding' type='tns:person'>  <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/>  <operation name='sayHello'>   <soap:operation soapAction='http://www.kingdz.org/greet'/>   <input>    <soap:body use='literal'/>   </input>   <output>    <soap:body use='literal'/>   </output>  </operation> </binding>
 

使用@SOAPBing指定WebService风格

JAX-WS2.0不仅支持面向RPCWebSe,也支持面向文档的WebService

属性说明

1)style,非必须,指定WebService风格,支持两个属性值

a)SOAPBingding.Style.DOCUMENT:使用面向文档的WebService,默认值

b)SOAPBingding.Style.RPC:使用面向RPCWebService

2)use,非必须,指定SOAP消息风格,支持两个属性值

a)SOAPBingding.Use.LITERAL:使用字面风格的SOAP消息。这是默认值。如果WebService服务器端和客户端不在一起开发,就应该使用这种风格的消息

b)SOAPBingding.Use.ENCODED:使用SOAP编码风格的SOAP消息。可能导致WebService互操作方面的问题,应尽量少使用这种风格的消息

3)parameterStyle:非必须,指定调用WebService操作的参数风格,支持两个属性值

a)SOAPBingding.ParamterStyle.WRAPPED:使用包装后的参数,默认值

b)SOAPBingding.ParamterStyle.BARE:使用未经包装的参数

注意:虽然use属性值可以为SOAPBingding.Use.ENCODED,但实际上该属性值指定为SOAP编码风格的消息可能并不实用,在WebLogic中会忽略该属性值,在JBoss服务器中会直接不支持这种风格的SOAP消息。

@Stateless@WebService(    name = "person",     serviceName = "personWS",     portName = "personPort",     targetNamespace = "http://www.kingdz.org")@SOAPBinding(    style = SOAPBinding.Style.RPC,     use = SOAPBinding.Use.ENCODED)public class PersonServiceBean implements PerspmService {    ...}

上面的类部署在JBoss中会直接提示错误。

SOAP encoding is not supported for JSR-181 deployments

 

使用@WebParam

该注解用于定义WebService操作的参数风格,该注解通常与@WebMethod一起使用

属性说明

1)header,非必须,指定是否从消息头中提取消息。

2)mode,非必须,指定参数的传递模式

a)WebParam.Mode.IN:指定使用传入参数的模式

b)WebParam.Mode.OUT:指定使用传出参数的模式

c)WebParam.Mode.INOUT:指定使用传入、传出参数的模式

3)name,非必须,指定该WSDLmessage元素的name属性值,没有指定该属性值,系统自动生成的name属性值与该形参名相同

4)targetNamespace,非必须,指定消息部分的目标命名空间。如果没有指定属性,默认使用与WebService相同的命名空间

例如

public String hello(@WebParam(    name=”somebd”,    targetNamespace=”http://blog.kingdz.org”)Person person){    ...}

使用@WebResult

@WebResult@WebParam十分相似,区别在于@WebResult用于定制返回值,因此比@WebParam少支持一个属性:mode

另外该注解用于修饰Bean方法本身

@Override@WebMethod(operationName = "sayHello", action = "http://www.kingdz.org/greet")@WebResult(name="helloResult",targetNamespace="http://www.hehe.org")public String hello(@WebParam(name = "somebd", targetNamespace = "http://blog.kingdz.org") Person person) {return person.getName();}
 

客户端调用WebService

Java作为编程语言,借助于CXF框架的支持来调用EJB所提供的WebService操作。此处采用动态客户端调用——客户端无需服务器端的任何东西,只要能访问远程WebServiceWSDL文档即可。

这里借助CXF来开发客户端

使用cxf需要借助wsdl2java工具

wsdl2java http://127.0.0.1:8080/Hello/PersonServiceBean?wsdl

这样会生成org的文件夹,包含了大量的Java源文件,是开发动态客户端的基础

public static void main(String[] args) {PersonWS service = new PersonWS();Person pws = service.getPersonPort();Person_Type person = new Person_Type();person.setName("kingdz");person.setAge(20);SayHello sh = new SayHello();sh.setSomebd(person);System.out.println(pws.sayHello(sh).getHelloResult());}

运行,输出kingdz

0 0
原创粉丝点击