这两天在学习WebService,首先选择的是XFire。服务端返回对象和集合,在客户端处理的时候我使用了两种方式。一种是自己手动创建客户端的代理接口和实体类。类所在的包同服务端一致;还有一种是我使用了Ant生成的客户端代码。第一种手动创建的测试返回值都没有问题,但是第二种方式我使用了xmlBeans工具所以生成的方法返回值类型是XmlObject,这里要怎么处理呢,要自己解析这个xml文件吗?XFire有没有自己的方式,可以直接把返回的XmlObject转换成实体对象呢?还有,我服务端一个方法接收一个实体类型的对象,在客户端调用这个方法的时候要如何传入对象呢?百度了一天也没有一个能很好的说明解决方法的,入门的helloword倒是不少。希望高手能帮忙看看,提点一小,或给点解决的意见。
下面是代码:
服务端代码结构:
实体类User.java
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private Date birthday;
//set,get..............
服务端服务类IHelloServiceImpl(接口IHelloService的代码就不贴了)
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.study.bo.User;
import com.study.service.IHelloService;
public class IHelloServiceImpl implements IHelloService {
public String copyMessage(String msg) {
return msg;
}
public List getList(List t) {
for(int i = 0 ; i < t.size() ; i++){
System.out.println(t.get(i));
}
List al = new ArrayList();
User user = new User();
user.setName("路人甲");
user.setBirthday(new Date());
al.add(user);
return al;
}
public void sayHello() {
System.out.println("hello world");
}
public User getUserByName(String name){
User user = new User();
user.setName(name);
return user;
}
}
因为使用了List类型,所以要做一个映射IHelloService.aegis.xml
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<method name="getList">
<parameter index="0" componentType="java.lang.String" />
<return-type componentType="com.study.bo.User" />
</method>
</mapping>
</mappings>
services.xml和web.xml的代码就不贴了,相信大家都知道
下面是客户端的:
代码结构:
客户端创建方式一:手动ClientFromInterface.java
package com.study.client;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.study.bo.User;
import com.study.service.IHelloService;
/**
* 使用WEB服务端提供的接口来创建客户端
* @author sysuser
*
*/
public class ClientFromInterface {
/**
* 1.使用XFire的ObjectServiceFactory从IHelloService接口创建一个服务模型Service<br/>
* 2.创建一个服务端代理<br/>
* 3.使用代理访问服务端方法
* @param args
* @throws MalformedURLException
*/
public static void main(String[] args) throws MalformedURLException {
//使用XFire的ObjectServiceFactory从IHelloService接口创建一个服务模型Service
Service serviceModel = new ObjectServiceFactory().create(IHelloService.class);
//访问地址
String url = "http://127.0.0.1:8181/StudyXFireService/services/HelloService";
//创建代理工厂
XFireProxyFactory proxyFactory = new XFireProxyFactory();
//通过proxyFactory,使用服务模型serviceModel和服务端点URL(用来获得WSDL)
//得到一个服务的本地代理,这个代理就是实际的客户端
IHelloService client = (IHelloService)proxyFactory.create(serviceModel, url);
client.sayHello();
String msg = client.copyMessage("路人小子 ");
System.out.println(msg);
User user = client.getUserByName("gaojun");
System.out.println(user.getName());
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setAge(10);
user1.setName("name_1");
user1.setBirthday(new Date());
User user2 = new User();
user2.setAge(20);
user2.setName("name_2");
user2.setBirthday(new Date());
userList.add(user1);
userList.add(user2);
List<User> list1 = client.getList(userList);
for(int i = 0 ; i < list1.size() ; i++){
System.out.println(list1.get(i).getName());
System.out.println(list1.get(i).getBirthday());
}
}
}
这种方式下,传入和接收User,List都没有问题。
客户端创建方式二:ant生成方式
HelloServicePortType.java
package com.study.antService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import org.apache.xmlbeans.XmlObject;
@WebService(name = "HelloServicePortType", targetNamespace = "http://www.study.xfire/HelloService")
@SOAPBinding(use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public interface HelloServicePortType {
@WebMethod(operationName = "getUserByName", action = "")
@WebResult(name = "out", targetNamespace = "http://www.study.xfire/HelloService")
public XmlObject getUserByName(
@WebParam(name = "in0", targetNamespace = "http://www.study.xfire/HelloService")
String in0);
@WebMethod(operationName = "getList", action = "")
@WebResult(name = "out", targetNamespace = "http://www.study.xfire/HelloService")
public XmlObject getList(
@WebParam(name = "in0", targetNamespace = "http://www.study.xfire/HelloService")
XmlObject in0);
@WebMethod(operationName = "copyMessage", action = "")
@WebResult(name = "out", targetNamespace = "http://www.study.xfire/HelloService")
public String copyMessage(
@WebParam(name = "in0", targetNamespace = "http://www.study.xfire/HelloService")
String in0);
@WebMethod(operationName = "sayHello", action = "")
public void sayHello();
}
HelloServiceClient.java
package com.study.antService;
import java.net.MalformedURLException;
import java.util.Collection;
import java.util.HashMap;
import javax.xml.namespace.QName;
import org.codehaus.xfire.XFireRuntimeException;
import org.codehaus.xfire.aegis.AegisBindingProvider;
import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Endpoint;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.soap.AbstractSoapBinding;
import org.codehaus.xfire.transport.TransportManager;
import org.codehaus.xfire.xmlbeans.XmlBeansTypeRegistry;
public class HelloServiceClient {
private static XFireProxyFactory proxyFactory = new XFireProxyFactory();
private HashMap endpoints = new HashMap();
private Service service0;
public HelloServiceClient() {
create0();
Endpoint HelloServicePortTypeLocalEndpointEP = service0 .addEndpoint(new QName("http://www.study.xfire/HelloService", "HelloServicePortTypeLocalEndpoint"), new QName("http://www.study.xfire/HelloService", "HelloServicePortTypeLocalBinding"), "xfire.local://HelloService");
endpoints.put(new QName("http://www.study.xfire/HelloService", "HelloServicePortTypeLocalEndpoint"), HelloServicePortTypeLocalEndpointEP);
Endpoint HelloServiceHttpPortEP = service0 .addEndpoint(new QName("http://www.study.xfire/HelloService", "HelloServiceHttpPort"), new QName("http://www.study.xfire/HelloService", "HelloServiceHttpBinding"), "http://127.0.0.1:8181/StudyXFireService/services/HelloService");
endpoints.put(new QName("http://www.study.xfire/HelloService", "HelloServiceHttpPort"), HelloServiceHttpPortEP);
}
public Object getEndpoint(Endpoint endpoint) {
try {
return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());
} catch (MalformedURLException e) {
throw new XFireRuntimeException("Invalid URL", e);
}
}
public Object getEndpoint(QName name) {
Endpoint endpoint = ((Endpoint) endpoints.get((name)));
if ((endpoint) == null) {
throw new IllegalStateException("No such endpoint!");
}
return getEndpoint((endpoint));
}
public Collection getEndpoints() {
return endpoints.values();
}
private void create0() {
TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());
HashMap props = new HashMap();
props.put("annotations.allow.interface", true);
AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new XmlBeansTypeRegistry()));
asf.setBindingCreationEnabled(false);
service0 = asf.create((com.study.antService.HelloServicePortType.class), props);
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://www.study.xfire/HelloService", "HelloServicePortTypeLocalBinding"), "urn:xfire:transport:local");
}
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://www.study.xfire/HelloService", "HelloServiceHttpBinding"), "http://schemas.xmlsoap.org/soap/http");
}
}
public HelloServicePortType getHelloServicePortTypeLocalEndpoint() {
return ((HelloServicePortType)(this).getEndpoint(new QName("http://www.study.xfire/HelloService", "HelloServicePortTypeLocalEndpoint")));
}
public HelloServicePortType getHelloServicePortTypeLocalEndpoint(String url) {
HelloServicePortType var = getHelloServicePortTypeLocalEndpoint();
org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
return var;
}
public HelloServicePortType getHelloServiceHttpPort() {
return ((HelloServicePortType)(this).getEndpoint(new QName("http://www.study.xfire/HelloService", "HelloServiceHttpPort")));
}
public HelloServicePortType getHelloServiceHttpPort(String url) {
HelloServicePortType var = getHelloServiceHttpPort();
org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
return var;
}
}
HelloServiceImpl.java
package com.study.antService;
import javax.jws.WebService;
import org.apache.xmlbeans.XmlObject;
@WebService(serviceName = "HelloService", targetNamespace = "http://www.study.xfire/HelloService", endpointInterface = "com.study.client.HelloServicePortType")
public class HelloServiceImpl
implements HelloServicePortType
{
public XmlObject getUserByName(String in0) {
throw new UnsupportedOperationException();
}
public XmlObject getList(XmlObject in0) {
throw new UnsupportedOperationException();
}
public String copyMessage(String in0) {
throw new UnsupportedOperationException();
}
public void sayHello() {
throw new UnsupportedOperationException();
}
}
测试类如下:
package com.study.client;
import org.apache.xmlbeans.XmlObject;
import com.study.antService.HelloServiceClient;
import com.study.antService.HelloServicePortType;
import com.study.bo.User;
public class HelloWordTest {
public static void main(String[] args) {
HelloServiceClient client = new HelloServiceClient();
HelloServicePortType service = client.getHelloServiceHttpPort();
service.sayHello();
String msg = "信息";
String ms = service.copyMessage(msg);
System.out.println(ms);
XmlObject xmlObject = service.getUserByName("snm");
System.out.println(xmlObject.toString());
}
}
可以看到,测试类返回的并不是User对象而是XmlObject,到这一步要如何处理呢?只能自己使用Dom或是其它工具解析xml了吗?XFire自己不提供转换成对象的功能吗?另xml打印结果如下:
<ns1:out xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.study.xfire/HelloService">
<age xmlns="http://bo.study.com">0</age>
<name xmlns="http://bo.study.com">snm</name>
</ns1:out>
代码有点多,主要是希望大家能看清楚。提点一下到这一步应该如果进行下去。
在实际的应用开发过程中,为了实现多平台的适用性,服务端和客户端一般都接收或返回xml文件的字符串,而尽量不使用复杂对象的吗?如果那样,对xml文件又是如何处理的呢,也是自己解析吗?
在解决问题的过程中看到SOAP,不知道是干什么用的,找时候学习一下。
- 大小: 16.1 KB
- 大小: 18.5 KB
分享到:
相关推荐
包括两个项目 服务器项目和客户端项目 测试的时候先发布服务器项目,然后运行客户端main方法测试。 测试内容: /*Aegis支持的类型*/ public int getInt(int a); public double getDouble(double a); public float ...
自个实践记录下来的,把每个步骤都截图下来,希望能有用
这个小实例有server和client的代码,server直接用myeclipse导入,然后添加spring2.0 aop和core,xfire1.2即可.client也是直接导入项目,然后导入jax-ws2.1api和jax-ws2.1 runtime libraries即可.这些包通过点击项目...
此程序demo详细描述的从发布接口到调用接口的全部过程,详细描述了Xfire调用webservice参数无法传递的问题。
xfire 使用外部类、返回collection及输入数组参数示例
包含了xfire发布webservice的服务端和客户端,可以直接放在tomcat或websphere里面调用。用过cxf发布webservice,发现与websphere有冲突,无奈转用xfire。
xfire跟spring和hibernate集成例子
XFire令WebService如此简单 对于一般的接口方法,即方法的返回类型或参数不是List或Map中存放对象的方
重写了XmlSchema-1.1的包路径,修改了xfire-core-1.2.6引用XmlSchema-1.1的路径,使XmlSchema-1.1和xmlschema-core(cxf必须包)可以同时引用
解决了Spring2.0和XFire1.2.6整合出错的问题 如果你觉得我骗分请不要下,谢谢!
以下四个类调用了XmlSchema-1.1.jar包 因与cxf包xmlschema-core-*.jar 冲突 故重新打包 XmlSchema-1.1.jar 源码修改原类径的方法来重新打包避免冲突 ... org.codehaus.xfire.wsdl11.parser.XmlSchemaURIResolver
XFire--Webservice入门xfire
xfire 1.26 博文链接:https://qgl.iteye.com/blog/119726
XFire创建WebService服务端和客户端
这个自己写的xFire发布WebService,包含发布和调用,可以用在企业中,而且所用的jar也比较少,不会出现很多jar的问题,一共才9个jar,[commons-codec-1.3.jar,commons-httpclient-3.0.jar,commons-logging-1.0.4.jar,...
xfire-all-1.2.6 xfire所需的全部包
Xfire案例
Xfire API 对开发web services有帮助!编写程序时作为参考!
XFire完整入门教程XFire完整入门教程XFire完整入门教程XFire完整入门教程
用xfire技术来实现服务端的开发,用axis1的技术来实现客户段的调用。一个完整的实例,包含所需要的全部jar包,下载后可以直接运行,简单 方便 通用