JavaEE5学习笔记09-将EJB发布成WebService总结(2)
以上例子只是简单调用了WebService,参数是简单的String,如果我们客户端需要获得复杂的,自定义的对象可以吗?答案是EJB容器也很完美的做到了
服务端代码如下
package webservice.HelloWebService;
?
import javax.ejb.Stateless;
import javax.jws.WebService;
import webservice.HelloWebService.pojo.Car;
?
@Stateless
@WebService(name = "HelloWebService")
public class CarWebService {
?
??? public Car callCar(String name) {
?????? System.out.println("客户" + name + "端调用了服务器端的代码");
?
?????? Car car = new Car();
?????? car.setName("宝马");
?????? car.setMessage("BMW");
?
?????? return car;
??? }
?
}
这个服务类调用了一个Car实体类,这个类是一个自定义的POJO类
代码如下
package webservice.HelloWebService.pojo;
?
public class Car {
?
??? private String name;
??? private String message;
?
??? public String getName() {
?????? return name;
??? }
?
??? public void setName(String name) {
?????? this.name = name;
??? }
?
??? public String getMessage() {
?????? return message;
??? }
?
??? public void setMessage(String message) {
?????? this.message = message;
??? }
?
??? @Override
??? public String toString() {
?????? // TODO Auto-generated method stub
?????? return "name:" + name + " --? " + message;
??? }
?
}
客户端在生成代码的时候也会将这个返回值的实体类代码生成一下。客户端生成的程序如下
?
测试代码如下
??? public static void main(String[] args) {
?????? CarWebServiceService carWebServiceService = new CarWebServiceService();
?????? HelloWebService helloWebService = carWebServiceService
????????????? .getHelloWebServicePort();
?????? Car car = helloWebService.callCar("素续缘");
?????? System.out.println(car.getName() + "--" + car.getMessage());
??? }
但是需要说明的一点就是在服务器端此Car实体类自己覆盖了toString方法,在客户端生成后的代码,并没有也像服务端那样覆盖toString,所以来说对于实体作为参数或者返回值的话,WebService关注的就是属性值。如果我们没有EJB服务器的实现支持,那么必须得借助像CXF、Axis2、XFire这种Web服务框架了。目前用得比较多的就是Axis2和CXF了。网上对2种框架也是褒贬不一,笔者的观点嘛~还是那句话,各有各的使用场景吧!