这两天在学习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
分享到:
相关推荐
1. **SOAP绑定**:XFire支持基于HTTP的SOAP绑定,允许应用程序通过HTTP协议发送和接收SOAP消息。 2. **WSDL第一**:它允许开发者从WSDL(Web服务描述语言)文档开始,自动生成服务端和客户端代码,简化了Web服务的...
本文将深入探讨XFire如何在服务端和客户端实现调用Web服务,以及与SOAP(简单对象访问协议)的结合使用。 首先,让我们理解XFire的核心功能。XFire是一个基于Java的轻量级框架,其设计目标是简化Web服务的开发过程...
5. **运行客户端**:使用Demo提供的客户端代码或自行创建的客户端,发送请求并接收响应。 通过这个Demo,你可以学习到: - 如何定义Web服务接口和实现 - Xfire的配置语法和服务注册 - 如何生成和使用动态代理 - ...
XFireClient是一款由...虽然XFireClient只是一个DEMO,但其背后涉及到的编程原理和技术广泛应用于各种复杂的客户端应用。通过学习和理解这个DEMO,开发者可以加深对客户端开发的理解,为构建更大规模的应用奠定基础。
总结来说,XFire客户端调用服务的过程涉及服务模型创建、Client实例化、服务代理对象、调用链信息构造、拦截器的执行以及远程服务请求的发送。拦截器是这一流程的关键,提供了强大的灵活性和可扩展性,允许开发者...
你可以使用SOAP客户端,如 SoapUI 或者 Xfire 提供的工具来测试你的服务,发送请求并接收响应。 总结起来,通过Xfire实现Web服务主要包括以下步骤:安装配置Xfire、定义服务接口、实现服务、配置服务暴露、编写WSDL...
综上所述,XFire Webservice服务器端是一个复杂的系统,涉及到了Web Service的核心概念、安全实践、性能优化等多个方面,对游戏开发者提供了丰富的功能接口,使得游戏能够更好地融入XFire的生态系统。
XFire Web Service可能使用SOAP(简单对象访问协议)或者REST(表述性状态转移)作为通信协议,这两种协议都是Web服务中常见的数据交换格式。 在描述中提到的静态List存储,这是一种在内存中创建并管理数据集合的...
为了实现这些功能,开发者通常需要编写复杂的网络请求代码,而XFire框架的存在则可以极大地简化这一过程。 首先,我们来看图片上传。在Android中,使用XFire进行图片上传通常涉及到以下步骤: 1. 创建XFire实例:...
而XFire是早期的Java Web服务实现,它提供了与SOAP(简单对象访问协议)的接口,便于开发和调用Web服务。本篇将深入探讨如何使用Mule ESB来调用由XFire发布的文件上传服务。 首先,理解Mule的核心概念至关重要。...
7. **拦截器(Interceptors)**:Xfire允许添加拦截器,这些拦截器在消息发送前或接收后执行,用于实现如日志记录、安全检查等附加功能。 8. **传输和绑定**:Xfire支持多种传输方式,如HTTP、HTTPS,以及绑定机制...
CXF支持拦截器(Interceptor),这是一种灵活的机制,可以在消息发送前或接收后执行自定义逻辑。拦截器可以用于日志记录、安全检查、性能监控等多种用途。你可以自定义拦截器,或者使用CXF提供的预定义拦截器。 **...
SOAP是一种基于XML的协议,用于交换结构化和类型化的信息。在JavaScript中调用WebService,通常涉及到创建一个HTTP请求,然后将SOAP消息作为请求体发送。在提供的示例中,我们看到了一个使用MooTools库实现的...
3. **发送和接收数据**:通过HTTP发送请求,然后解析返回的SOAP响应。这可能涉及XML解析(如使用DOM或SAX解析器)。 4. **处理结果**:将接收到的数据转换为Android可使用的对象,然后更新UI或执行其他操作。 **五...
因此,调用Web服务方法时,传入Java对象,CXF会将其转化为XML发送;接收到服务器响应后,再将XML转化为Java对象返回。 4. **实例代码分析** 下面是一个简单的Spring配置示例,用于创建CXF客户端: ```xml ...
2. 为了提高用户体验,可以在前端进行文件大小和类型的初步检查。 3. 考虑到性能,对于大文件上传,可能需要实现断点续传功能。 4. 保持代码的可维护性和扩展性,避免硬编码路径和配置。 通过深入理解`jsp...
JAXM(Java API for XML Messaging)专注于提供发送和接收XML消息的能力,它包括了SOAP消息的发送和接收,SAAJ(SOAP With Attachments API for Java)则在此基础上提供了解析和构建SOAP消息包的能力,包括对SOAP...
它使得开发者能够在Java应用中发送和接收电子邮件。 5. **saaj-impl-1.3.jar**:SOAP with Attachments API for Java (SAAJ) 实现,是处理SOAP消息的标准Java API。它提供了创建、读取和操作SOAP消息的能力,包括...