一、Xfire部署构建
使用Xfire来构建一套java的webservice服务接口是很容易的。现在xfire已经停止开发,被apache合并为CXF项目。我们下载Xfire项目使用jar包,扔进到项目的buildpath中去。核心的jar包括如下:
我们在src目录下新建一个文件夹META-INF,再建它的一个字文件夹xfire,里面建立文件services.xml。之后的结构如下:
我们直接看一下servics.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<!-- webserviceq名称,调用时需要指定这个 -->
<name>readerService</name>
<!-- 这个一般是自己公司的网址,意义不大 -->
<namespace>http://test/HelloService</namespace>
<!-- 接口类 -->
<serviceClass>com.xfire.servlet.IReaderService</serviceClass>
<!-- 实现类 -->
<implementationClass>com.xfire.servlet.ReaderService</implementationClass>
</service>
</beans>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<!-- webserviceq名称,调用时需要指定这个 -->
<name>readerService</name>
<!-- 这个一般是自己公司的网址,意义不大 -->
<namespace>http://test/HelloService</namespace>
<!-- 接口类 -->
<serviceClass>com.xfire.servlet.IReaderService</serviceClass>
<!-- 实现类 -->
<implementationClass>com.xfire.servlet.ReaderService</implementationClass>
</service>
</beans>
很多人以为这样就行了,不,还没行,你指定了这个,那别人怎么访问呢。怎么把相应的请求转发到xfire那里,让它进行处理呢。这里又需要修改web.xml了。
修改后如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
其实也就是添加了一个servlet和对应的mapping。接下来,我们在浏览器上直接输入:
二、使用Xstream进行java对象和XML格式的转化
我经历的项目使用webservice一般是和第三方厂商进行数据交互,所以制定系统对接时采取XML为基础的接口操作规范文档是很重要的。不管是我们发布webservice服务接口还是作为客户端调用别人的webservice接口,和自身原有系统整合时都难免需要将XML和POJO对象进行互相转化而便于开发。这时候我们可以使用XML解析器对XML进行解析后重新创建java对象,反之亦然。但这样做代码并不经济,我们需要对XML进行历遍和检索才能转成合格的java对象。所以,Xstream帮我们完成了这样重复的工作,我们只需要正确使用它,就可以很容易将两者相互转化。
Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列化,使用非常方便。
不需要在配置文件中进行额外配置,只需要往工程中导入jar包即可,我所使用的jar包为:
Xstream提供了很多功能接口来自定义转化的需求。我们重点对下面几个接口的功能做一下介绍:
首先我们代码实例都使用这样的javabean来进行讲解:
package test.xstream.test;
public class Author {
private String name;
public Author(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
1、xStream.alias(String, Class),作用:将序列化中的类全量名称,用别名替换。如果不显示调用该接口,XML的tag会使用该javabean的类全量路径。
不使用别名alias时序列化出来的xml:
<test.xstream.test.Author>
<name>name</name>
</test.xstream.test.Author>
使用别名alias时序列化出来的xml:
<Author>
<name>name</name>
</Author>
使用方法:xstream.alias("Author",Author.class)
2、xstream.aliasField(String, Class, String),作用:使用别名替代属性名。
不使用别名aliasField时序列化出来的xml:
<Author>
<name>name</name>
</Author>
使用别名aliasField时序列化出来的xml:
<Author>
<author>name</author>
</Author>
使用方法:xstream.aliasFiel("author", Author.class, "name"),其实就是将类中的属性“name”指定别名“author”输入或输出。
3、xstream.registerLocalConverter(Class definedIn, String fieldName, Converter converter),作用:自定义转换器,可以将指定的class的属性(该属性一般是List类型)转入到特定的转换器中进行处理。
代码说明:
xstream.registerLocalConverter( AppBsChangeResult.class, "entityIDs", new ListConverter("accID"))
public class AppBsChangeResult extends AppBsBaseDriverResult {
private static Logger logger = Logger.getLogger(AppBsChangeResult.class);
private List<String> entityIDs = null;
public List<String> getEntityIDs() {
return entityIDs;
}
public void setEntityIDs(List<String> entityIDs) {
this.entityIDs = entityIDs;
}
}
public class ListConverter implements Converter {
public ListConverter(String tagName){
this.tagName = tagName;
}
private String tagName = null;
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext arg2) {
List<String> list = (List<String>) value;
for (String subval : list) {
// 为了转换成XML时,保证有<expands></expands>全标签,将值为空时不写标签只输出“”
if("".equals(subval) && list.size()==1){
writer.setValue(subval);
}else{
writer.startNode(tagName);
writer.setValue(subval);
writer.endNode();
}
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
List<String> list = new ArrayList<String>();
while (reader.hasMoreChildren()) {
reader.moveDown();
String key = reader.getNodeName();
String value = null;
if (reader.hasMoreChildren()) {
value = (String)unmarshal(reader, context);
} else {
value = reader.getValue();
}
// insert into list
list.add(value);
reader.moveUp();
}
return list;
}
//覆写父类的方法,指明哪种java类型可以被转化器处理
public boolean canConvert(Class type) {
return type.equals(ArrayList.class);
}
}
执行xstream.registerLocalConverter( AppBsChangeResult.class, "entityIDs", new ListConverter("accID"))后,就可以将XML中N个accID标签的值转化为AppBsChangeResult类中属性"entityIDs",因为属性"entityIDs"是一个List<String>,所以就可以将N个accID的值都add进去这个List了。注意转化器的抽象接口marshal一般用在javabean对象转为XML的过程中(序列化),而抽象接口unmarshal用在XML转javabean对象的过程中(反序列化)。
4、xstream.addDefaultImplementation(Class, Class),作用:使用抽象类, 或父子类的转换
如果将抽象类或父类做为类的属性时, 将对象转化成xml时, 会在抽象属性对应的结点增class属性, 值为子类的包路径,
将class属性去掉办法:
xStream.addDefaultImplementation(Sun.class,Parent.class)
如果将抽象类或父类做为类的属性, 将xml串转化为对象时, 如果对应的结点带有class属性, 转化没有问题, 如果将xml串中的class属性去掉, 转换对象时, 就会抛异常:java.lang.InstantiationError
解决办法同样是:
xStream.addDefaultImplementation(Sun.class,Parent.class)
5、xstream.omitField(Class, String),作用: 定义某一个属性的值不进行xml序列化,即是对指定的字段不予处理。序列化时隐藏该字段,反序列化时该字段为null
6、xstream.useAttributeFor(Class, String),xstream.useAttributeFor(String, Class)和xstream.useAttributeFor(Class)
- xstream.useAttributeFor(String.class); 对所有String类型的字段定义为属性tag显示
- xstream.useAttributeFor("name", String.class); 对所有String类型的字段名成为name 定义为属性tag显示
- xstream.useAttributeFor(Person.class, "name"); 把字段节点设置成属性,单独使用以上方法
<test.Person>
<name>张三</name>
<age>19</age>
<string>李四</string>
<string>王五</string>
<string>赵六</string>
</test.Person>
将以下面XML格式输出:
<test.Person name="张三">
<age>19</age>
<string>李四</string>
<string>王五</string>
<string>赵六</string>
</test.Person>
7、xstream.addImplicitCollection(Class, String),作用:省略集合根节点
public class Person {
private String name;
private int age;
private List friends;
public Person(String name, int age, String... friends) {
this.name = name;
this.age = age;
this.friends = Arrays.asList(friends);
}
}
public class XstreamTest {
public static void main(String[] args) {
Person bean = new Person("张三", 19, "李四", "王五", "赵六");
XStream xStream = new XStream(new DomDriver());
xStream.addImplicitCollection(Person.class, "friends");
//序列化
String xml = xStream.toXML(bean);
System.out.println(xml);
//反序列化
bean=(Person)xStream.fromXML(xml);
System.out.println(bean);
}
}
xStream.addImplicitCollection(Person.class, "friends")使用前后XML对照如下。
使用前:
<test.Person>
<name>张三</name>
<age>19</age>
<friends class="java.util.Arrays$ArrayList">
<a class="string-array">
<string>李四</string>
<string>王五</string>
<string>赵六</string>
</a>
</friends>
</test.Person>
使用后:
<test.Person>
<name>张三</name>
<age>19</age>
<a class="string-array">
<string>李四</string>
<string>王五</string>
<string>赵六</string>
</a>
</test.Person>
相关推荐
"Java 使用 XFire 调用 webService 接口" 在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单...
这篇博客“Java使用XFire调用WebService接口”显然是讨论如何利用XFire这个开源框架来与Web服务交互。 XFire是Apache CXF项目的前身,它提供了一种简单的方式来创建和消费SOAP Web服务。XFire的强项在于其轻量级和...
标题中的“xfire+spring+maven构建webservice服务器和客户端”揭示了本教程将围绕三个主要技术进行讨论:XFire、Spring和Maven。这三者都是Java开发中不可或缺的工具,尤其在构建Web服务方面。 XFire是早期的一个...
XFire作为一个优秀的WebService框架,为Java开发者提供了强大且易用的工具,使得构建和使用WebService变得简单。通过深入理解其工作原理和使用方法,开发者可以更灵活地构建跨平台的应用程序,实现不同系统间的无缝...
XFire的强大之处在于其易于使用和丰富的功能集,可以方便地处理复杂的Web服务交互。在实际项目中,还可以利用XFire进行更高级的配置,例如添加安全性、事务管理等特性,以满足不同的业务需求。 【标签】: ...
标题“使用xfire+spring构建webservice”指出的是一个关于如何利用XFire和Spring框架创建Web服务的教程。XFire是早先的一个用于构建Web服务的开源Java库,它简化了SOAP(简单对象访问协议)服务的开发。而Spring框架...
XFire提供了一种轻量级、快速且易于使用的API,使得开发人员可以快速地将Java方法暴露为Web服务,或者调用远程Web服务。 **服务端构建:** 1. **环境准备**:确保已安装Java Development Kit(JDK)和Maven。XFire...
在Java开发中,有时我们需要与外部服务进行交互,如发送短信、获取数据等,这时就会用到Web Service。本文将详细介绍如何使用HttpClient和XFire这两种不同的库来调用Web Service,特别是针对短信接口的调用。 首先...
Xfire是一款开源的Java库,用于构建Web服务客户端和服务端。它基于SOAP协议,提供了一种简单的方式来创建、部署和消费Web服务。Xfire简化了开发过程,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。在...
这篇博客文章“xfire发布webservice服务”可能详细介绍了如何使用XFire来构建并发布一个Web服务。 【描述】:“NULL” 虽然描述为空,但我们可以推测文章可能包含了从安装XFire到编写服务接口,再到部署和测试Web...
Java平台提供了多种实现Web服务的方法,其中Xfire是一个流行的框架,它简化了构建和使用Web服务的过程。本文将深入探讨如何使用Xfire来创建一个完整的JAVA Web服务,包括服务端和客户端的实现。 首先,Xfire是一个...
Xfire是一款曾经流行的开源Java框架,用于构建和消费Web服务。在本文中,我们将深入探讨Xfire调用Web服务时遇到的参数传递问题以及解决策略。 首先,让我们了解Web服务的基本概念。Web服务基于SOAP(Simple Object ...
本文详细介绍了如何使用Java结合XFire框架来实现WebService接口的开发和调用。通过实际操作和示例代码,我们不仅了解了服务端的搭建过程,还学会了如何在客户端调用这些接口。这对于开发分布式系统或进行跨平台服务...
虽然现在可能不再是最新的选择,但理解其工作原理和使用方法,对于理解Web服务的基本概念和开发流程仍然具有重要意义。通过学习这个实例,你可以更好地掌握如何在实际项目中实现和使用Web服务。
XFire是Apache CXF项目的前身,它是一个用于构建和开发Web服务的框架。在本文中,我们将深入探讨如何使用Java XFire来调用本地及远程的WebService。 首先,让我们理解什么是Web服务。Web服务是一种基于网络的软件...
总之,使用XFire和Spring构建WebService是一种强大的组合,它允许开发者利用Spring的强大功能和XFire的易用性,快速、高效地开发和部署Web服务。理解并掌握这一技术将对提升开发者在Web服务领域的专业技能大有裨益。
综上所述,"用XFire开发WebService+Spring注解"的主题涵盖了Web服务开发的核心技术和Spring框架的高级应用,通过学习和实践,开发者能够更好地理解和掌握如何在Java环境中构建高效、灵活的分布式系统。
总结,Java WebService基于XFire的实例是一个很好的起点,让你了解如何在Java中构建和使用Web服务。通过这个实例,你可以学习到Web服务的基本概念,XFire的使用,以及如何创建和调用Web服务。随着对Web服务的深入...
总结来说,利用XFire和MyEclipse开发Web服务是一种高效的方法,尤其对于初学者,XFire的简洁性和易用性使其成为学习Web服务开发的理想选择。通过以上步骤,你可以轻松地构建并部署自己的第一个Web服务。
在编码阶段,XFire支持注解驱动的开发模式,这意味着你可以使用如`@WebService`和`@WebMethod`等JAX-WS注解来标记你的服务类和方法。这种方式使得代码更清晰,减少了XML配置的复杂性。 在部署方面,XFire插件可以...