您的位置:首页 > 编程语言 > Java开发

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

2017-04-25 17:35 274 查看
@WebMethod用于修饰EJB Bean实现类的方法
使用该注解的最常用功能是将Bean实现类中某个方法排除在WebService之外。如果不使用该注解修饰,在默认情况下,EJB容器会将Bean实现类中所有方法暴露成WebService。
WebService经常与SOA一起被提起,SOA即Service
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.
4000
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不仅支持面向RPC的WebSe,也支持面向文档的WebService。
属性说明
1)style,非必须,指定WebService风格,支持两个属性值
a)SOAPBingding.Style.DOCUMENT:使用面向文档的WebService,默认值
b)SOAPBingding.Style.RPC:使用面向RPC的WebService
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,非必须,指定该WSDL中message元素的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操作。此处采用动态客户端调用——客户端无需服务器端的任何东西,只要能访问远程WebService的WSDL文档即可。
这里借助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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: