XFire 和 Spring 是可以完美整合的,上一篇写的有点糟糕,现在直接上更加清晰的例子吧!
XFire 的简单使用,我这里就不弄了,毕竟显示中很少使用,一般都是和框架结合使用如:spring 等;
我在这里重新梳理下:
步骤:
1、 添加jar依赖
2、 修改web.xml
3、 修改applicationContext.xml
4、 编写接口和实现或校验类
1、在Maven 的 POM 文件中添加的 jar 包依赖
<!-- xfire 依赖包 --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.codehaus.xfire</groupId> <artifactId>xfire-aegis</artifactId> <version>1.2.6</version> </dependency> <dependency> <groupId>org.codehaus.xfire</groupId> <artifactId>xfire-spring</artifactId> <version>1.2.6</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>xalan</groupId> <artifactId>xalan</artifactId> <version>2.7.0</version> </dependency>
其中,要去掉XFier自带的spring1.2.6.jar 包,否则会包冲突的。
2、修改WEB.XML 文件
<context-param> <param-name>contextConfigLocation</param-name> <!-- 引入 classpath:org/codehaus/xfire/spring/xfire.xml --> <param-value>classpath:org/codehaus/xfire/spring/xfire.xml,classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- begin XFire 配置 --> <servlet> <servlet-name>XFireServlet</servlet-name> <!-- 不整合spring 时使用org.codehaus.xfire.transport.http.XFireConfigurableServlet --> <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping> <!-- end XFire 配置 -->
注意,这里要引入 xfire-spring-1.2.6.jar 包中的 org/codehaus/xfire/spring/xfire.xml ,和配置 XFire的Mapping
3、修改applicationContext.xml
<!-- =================== 通知公告 =================== --> <bean id="iTSMEStandardService" class="com.topinfo.xfire.webserviceImpl.ITSMEStandardServiceImpl"> <property name="slNoticeServiceImpl" ref="slNoticeServiceImpl"></property> </bean> <bean name="WebService" class="org.codehaus.xfire.spring.ServiceBean"> <!-- 业务接口实现类 --> <property name="serviceBean" ref="iTSMEStandardService"/> <!-- 业务接口 --> <property name="serviceClass" value="com.topinfo.xfire.webservice.ITSMEStandardService"/> <property name="inHandlers"> <list> <ref bean="addressingHandler"/> <ref bean="handlerMappingListener"/><!--普通的用户名密码的方式进行WebService的验证--> </list> </property> <property name="namespace" value="http://com.topinfp/iTSMEStandardWebService" ></property> </bean> <bean id="addressingHandler" class="org.codehaus.xfire.addressing.AddressingInHandler"/> <bean id="handlerMappingListener" class="com.topinfo.xfire.webservice.listener.HandlerMappingListener"/>
这里是添加是。校验的 handlerMappingListener ,如果没有,可以去掉,不过,在生产环境下,校验还是必须要有点。是吧!
到现在为止。所有的配置就完成了。接下来。。我们只要编写我们的 接口 、实现类和 校验类了
接口:
package com.topinfo.xfire.webservice;
import com.topinfo.xfire.bean.SlNoticeBean;
/**
*@Description: Web Service 接口
*@Author:杨攀
*@Since:2014年3月26日上午10:49:34
*/
public interface ITSMEStandardService {
/**
*@Description: 同步新增通知公告
*@Author: 杨攀
*@Since: 2014年3月26日上午10:44:39
*@param slNoticeBean
*@return -
*/
public boolean synAddSlNotice(SlNoticeBean slNoticeBean);
/**
*@Description: 同步修改通知公告
*@Author: 杨攀
*@Since: 2014年3月26日上午10:44:39
*@param slNoticeBean
*@return -
*/
public boolean synUpdateSlNotice(SlNoticeBean slNoticeBean);
/**
*@Description: 同步删除通知公告
*@Author: 杨攀
*@Since: 2014年3月26日上午10:47:26
*@param slNoticeBeanId
*@return
*/
public boolean synDeleteSlNotice(String slNoticeBeanId);
}
实现类:
package com.topinfo.xfire.webserviceImpl;
import org.apache.commons.lang3.StringUtils;
import com.topinfo.entity.SlNotice;
import com.topinfo.libs.BeanUtil;
import com.topinfo.service.SlNoticeService;
import com.topinfo.xfire.bean.SlNoticeBean;
import com.topinfo.xfire.webservice.ITSMEStandardService;
public class ITSMEStandardServiceImpl implements ITSMEStandardService {
private SlNoticeService slNoticeServiceImpl;
public SlNoticeService getSlNoticeServiceImpl() {
return slNoticeServiceImpl;
}
public void setSlNoticeServiceImpl(SlNoticeService slNoticeServiceImpl) {
this.slNoticeServiceImpl = slNoticeServiceImpl;
}
@Override
public boolean synAddSlNotice(SlNoticeBean slNoticeBean) {
boolean bool = false;
if(slNoticeBean != null){
try {
SlNotice bean = new SlNotice();
String [] fields = {"id","title","content","type","status","createTime","creator","updateTime","updator"};
//复制 bean 的属性
BeanUtil.copyProperties(slNoticeBean, bean, fields);
String uuid = slNoticeServiceImpl.insert(bean);
if(StringUtils.isNotBlank(uuid)){
bool = true;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return bool;
}
@Override
public boolean synUpdateSlNotice(SlNoticeBean slNoticeBean) {
boolean bool = false;
if(slNoticeBean != null){
try {
SlNotice bean = new SlNotice();
String [] fields = {"id","title","content","type","status","createTime","creator","updateTime","updator"};
//复制 bean 的属性
BeanUtil.copyProperties(slNoticeBean, bean, fields);
bool = slNoticeServiceImpl.update(bean);
} catch (Exception e) {
e.printStackTrace();
}
}
return bool;
}
@Override
public boolean synDeleteSlNotice(String slNoticeBeanId) {
boolean bool = false;
if(StringUtils.isNotBlank(slNoticeBeanId)){
bool = slNoticeServiceImpl.delete(slNoticeBeanId);
}
return bool;
}
}
校验监听类:
package com.topinfo.xfire.webservice.listener;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
/**
* @Description: 监听处理器
* @Author:杨攀
* @Since:2014年3月25日上午11:19:55
*/
public class HandlerMappingListener extends AbstractHandler {
public void invoke(MessageContext context) throws Exception {
// 为SOAP Header构造验证信息
if (context.getInMessage().getHeader() == null) {
throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息", org.codehaus.xfire.fault.XFireFault.SENDER);
}
Element token = context.getInMessage().getHeader().getChild("AuthenticationToken");
if (token == null) {
throw new org.codehaus.xfire.fault.XFireFault("请求必须包含身份验证信息", org.codehaus.xfire.fault.XFireFault.SENDER);
}
String username = token.getChild("Username").getValue();
String password = token.getChild("Password").getValue();
try {
// 进行身份验证 ,只有admin/admin 的用户为授权用户
if ("admin".equals(username) && "admin".equals(password)) {
System.out.println("身份验证通过");
} else {
throw new Exception();
}
} catch (Exception e) {
throw new org.codehaus.xfire.fault.XFireFault("非法的用户名和密码", org.codehaus.xfire.fault.XFireFault.SENDER);
}
}
}
实体:
package com.topinfo.xfire.bean;
import java.io.Serializable;
public class SlNoticeBean implements Serializable {
/**
*@Fields serialVersionUID :
*/
private static final long serialVersionUID = 6504083322529047064L;
/**
*主键编号
*/
private String id;
/**
*标题
*/
private String title;
/**
*内容
*/
private String content;
/**
*类型
*/
private String type;
/**
*发布状态
*/
private Long status;
/**
*发布时间
*/
private java.util.Date createTime;
/**
*发布人
*/
private String creator;
/**
*更新时间
*/
private java.util.Date updateTime;
/**
*更新人
*/
private String updator;
//省略get set 方法
}
注意, 在互联网上面传实体,请先序列化......这个不用多说的吧。
这样, WebService 就完成了,
接下来我们测试一下
运行:访问:http://localhost:8080/ITSMEStandard/webservice/ITSMEStandardService?wsdl
编写客户端:
客户的代码可以有好几种实现
1、 可以通过 wsdl 生产,网上有很多小工具
2、 通过 eclipse 帮我们生产,需要引入插件,这个可以自己百度
3、 自己写,哈哈哈
必须把服务器的 接口 和实体 类打成 jar 包,提供给客户端,
package com.topinfo.test;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.topinfo.xfire.bean.SlNoticeBean;
import com.topinfo.xfire.listener.ClientHandler;
import com.topinfo.xfire.webservice.ITSMEStandardService;
public class ITSTest {
public static void main(String[] args) {
// 这里是创建一个service,需要传入一个接口类,因为我们后面必须调用相应的接口方法
Service srcModel = new ObjectServiceFactory().create(ITSMEStandardService.class);
// 代理工厂,这里是为了后面创建相应的接口类
// XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
XFireProxyFactory factory = new XFireProxyFactory();
String readerServiceUrl = "http://localhost:8080/ITSMEStandard/webservice/ITSMEStandardService";
try {
// 利用工厂返回相应的接口类
ITSMEStandardService service = (ITSMEStandardService) factory.create(srcModel,
readerServiceUrl);
SlNoticeBean slNoticeBean = new SlNoticeBean();
slNoticeBean.setId("F5861A201A167A11E040A8C0E72829D6");
slNoticeBean.setTitle("杨XXXXX网络体系.....");
//boolean bool = service.synUpdateSlNotice(slNoticeBean);
//在报头加入信息,供安全校验
XFireProxy proxy = (XFireProxy) Proxy.getInvocationHandler(service);
Client client = proxy.getClient();
// 发送授权信息
client.addOutHandler(new ClientHandler("admin","admin1"));
boolean bool = service.synDeleteSlNotice("F5861A201A167A11E040A8C0E72829D6");
System.out.println(bool);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
OK ,,到此结束!