最近研究了一下WebService的用法,使用的是xfire+tomcat以及xfire+Weblogic9.2.借助于工具MyEclipse建立一个WebService是非常容易的事情,可以通过MyEclipse的File ——》New ——》Web Service Project的步骤建立一个WebService工程,如果使用Xfire的话,注意选择xfire。这样只是建立了一个WebService工程,要想生成一个服务端的框架可以通过File——》New——》Other——》Web Services ——》Web Servie,在New Web Service页面上选择已经创建好的Web Service Project.在Strategy选项选择Create Web Service from java class ,并勾选上Create new java bean,完成后在名为I**(**为你的WebService名称)中定义WebService接口,在**Impl文件中实现你的WebService逻辑。然后使用tomcat发布就可以了。
在使用Weblogic作为服务器发布的时候,和上面步骤一样,只是进行发布的时候配置一下Weblogic就行。在这个过程中可能遇到以下问题:
一,在myeclipse启动不起来Weblogic,解决:进入Weblogic目录,手动启动就行。
二,weblogic启动可能报错:
<BEA-160197>
<Unable to load descriptor C:\bea\user_projects\domains\base_domain\.\autodeploy\demo/WEB-INF/web.xml of module webProject. The error is weblogic.descriptor.DescriptorException: Unmarshaller failed
at weblogic.descriptor.internal.MarshallerFactory$1.createDescriptor
Caused by: com.bea.xml.XmlException: failed to load java type corresponding to e=web-app@http://java.sun.com/xml/ns/javaee
at com.bea.staxb.runtime.internal.UnmarshalResult.getPojoBindingType
解决方法:
我把原来的:
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
换成:
<web-app xmlns:j2ee="http://java.sun.com/xml/ns/j2ee">即可。原来是weblogic92不支持用eclipse自动生成2.5版本的web.xml。
再说说客户端编程,客户端也可以通过myeclipse自动生成,只要指定wsdl文件或者服务端的wsdl的URL。不但可以传递简单类型,也可以传递复杂类型。以下是客户端调用的代码示例:
public static void main(String[] args) {
MyWebServiceClient client = new MyWebServiceClient();
//create a default service endpoint
MyWebServicePortType service = client.getMyWebServiceHttpPort();
//TODO: Add custom client code here
//
//service.yourServiceOperationHere();
//调用operaiton方法
int re = service.operaiton(1900, 66, "*");
System.out.println("计算结果为:"+re);
//调用modified(User U)方法
ArrayOfUser a = new ArrayOfUser();
User u = new User();
//注意通过JAXB传递字符串型,因为绑定了JAXB,命名空间http://service.web一定要写对
JAXBElement<String> name = new JAXBElement<String>(new QName(
"http://service.web", "name"), String.class, "Mr.li");
u.setName(name);
u.setNumber(007);
//无法修改服务端设定的name和number
service.modified(u);
List<User> l = new ArrayList<User>();
a.user = l;
a.user.add(u);
//调用addUser(List<User> l)方法
ArrayOfUser li = (ArrayOfUser)service.addUser(a);
for(int i = 0; i <li.user.size();i++)
{
System.out.println(li.user.get(i).getName().getValue());
System.out.println(li.user.get(i).getNumber());
}
System.out.println("test client completed");
System.exit(0);
}
这样就完成了Webservice的建立和调用过程。
PS:WebService以我目前的理解好像不能处理传出参数,也就是我传入一个参数USer u,在服务端改变了User U的值(比如是名字和编号),客户端调用后,不能获得服务端修改的值。也就是服务端对客户端的响应内容都是通过返回值来的。如果哪位有不同见解,可以联系我,我们一起探讨。