`
大猫阿Ken
  • 浏览: 23140 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

xfire1.2.6不能访问互联网环境下的问题及解决方案

阅读更多
前几天用xfire开发了个接口,本来在工程可以访问互联网的情况下没有任何问题的,但昨天部署到客户的内网环境就出问题了,异常如下:
javax.faces.FacesException: java.net.UnknownHostException: www.springframework.org

找不到主机www.springframework.org,因为不能访问互联网
找到问题出处,在xfire的配置文件/WEB-INF/xfire-servlet.xml,该文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<!-- 引入XFire预配置信息 -->
	<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
	<!-- 定义访问的url -->
	<bean
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="urlMap">
			<map>
				<entry key="/WSPersonsInfoService.ws">
					<ref bean="WSPersonsInfoService" />
				</entry>
			</map>
		</property>
	</bean>
	<!-- 使用XFire导出器 -->
	<bean id="baseWebService"
		class="org.codehaus.xfire.spring.remoting.XFireExporter"
		lazy-init="false" abstract="true">
		<!-- 引用xfire.xml中定义的工厂 -->
		<property name="serviceFactory" ref="xfire.serviceFactory" />
		<!-- 引用xfire.xml中的xfire实例 -->
		<property name="xfire" ref="xfire" />
	</bean>
	<bean id="WSPersonsInfoService" parent="baseWebService">
		<!-- 业务服务bean -->
		<property name="serviceBean" ref="WSPersonsInfoImp" />
		<!-- 业务服务bean的窄接口类 -->
		<property name="serviceClass"
			value="com.ws.yxjsry.IWSPersonsInfo" />
	</bean>
	<bean id="WSPersonsInfoImp"
		class="com.ws.yxjsry.WSPersonsInfoImp" />
</beans>



问题就出在
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
在不能访问互联网的条件下访问不了http://www.springframework.org/dtd/spring-beans.dtd


解决方案尝试:
在网上找了半天,很多说把DOCTYPE改为访问本地文件,如:
<!DOCTYPE beans SYSTEM "spring-beans.dtd">
需要把spring-beans.dtd文件放在classpath目录下,例如tomcat的tomcat/bin/目录下。
修改后启动,发现仍然报找不到主机www.springframework.org,仔细查找后发现原因是在xfire-servlet.xml里面有一行<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
在xfire.xml中存在
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
而且在xfire.xml中还有引用另一个xml文件
<import resource="customEditors.xml"/>
customEditors.xml中也存在
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

因为xfire.xml和customEditors.xml在xfire-all-1.2.6,jar里面,不想对JAR包作修改,于是,我就想到了把,xfire.xml和customEditors.xml的内容直接复制到xfire-servlet.xml里面,把引用<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
去掉,问题就可以解决了,修改后的xfire-servlet.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans SYSTEM "spring-beans.dtd">
	<!-- 引入XFire预配置信息 -->
	<bean id="xfire.customEditorConfigurer"
		class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry
					key="org.codehaus.xfire.service.ServiceFactory">
					<bean
						class="org.codehaus.xfire.spring.editors.ServiceFactoryEditor">
						<property name="transportManager"
							ref="xfire.transportManager" />
					</bean>
				</entry>
			</map>
		</property>
	</bean>
	<bean id="xfire.serviceRegistry"
		class="org.codehaus.xfire.service.DefaultServiceRegistry"
		scope="singleton" />

	<bean id="xfire.transportManager"
		class="org.codehaus.xfire.transport.DefaultTransportManager"
		scope="singleton" init-method="initialize" destroy-method="dispose">
	</bean>

	<bean id="xfire" class="org.codehaus.xfire.DefaultXFire"
		scope="singleton">
		<constructor-arg index="0">
			<ref bean="xfire.serviceRegistry" />
		</constructor-arg>
		<constructor-arg index="1">
			<ref bean="xfire.transportManager" />
		</constructor-arg>
	</bean>

	<bean id="xfire.typeMappingRegistry"
		class="org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry"
		init-method="createDefaultMappings" scope="singleton">
	</bean>

	<bean id="xfire.aegisBindingProvider"
		class="org.codehaus.xfire.aegis.AegisBindingProvider"
		scope="singleton">
		<constructor-arg index="0">
			<ref bean="xfire.typeMappingRegistry" />
		</constructor-arg>
	</bean>

	<bean id="xfire.serviceFactory"
		class="org.codehaus.xfire.service.binding.ObjectServiceFactory"
		scope="singleton">
		<constructor-arg index="0">
			<ref bean="xfire.transportManager" />
		</constructor-arg>
		<constructor-arg index="1">
			<ref bean="xfire.aegisBindingProvider" />
		</constructor-arg>
	</bean>

	<bean id="xfire.servletController"
		class="org.codehaus.xfire.transport.http.XFireServletController"
		scope="singleton">
		<constructor-arg>
			<ref bean="xfire" />
		</constructor-arg>
	</bean>

	<bean id="xfire.messageServiceFactory"
		class="org.codehaus.xfire.service.binding.ObjectServiceFactory">
		<constructor-arg index="0" ref="xfire.transportManager" />
		<constructor-arg index="1" ref="xfire.messageBindingProvider" />
		<property name="style" value="message" />
	</bean>

	<bean id="xfire.messageBindingProvider"
		class="org.codehaus.xfire.service.binding.MessageBindingProvider" />

	<!-- 定义访问的url -->
	<bean
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="urlMap">
			<map>
				<entry key="/WSPersonsInfoService.ws">
					<ref bean="WSPersonsInfoService" />
				</entry>
			</map>
		</property>
	</bean>
	<!-- 使用XFire导出器 -->
	<bean id="baseWebService"
		class="org.codehaus.xfire.spring.remoting.XFireExporter"
		lazy-init="false" abstract="true">
		<!-- 引用xfire.xml中定义的工厂 -->
		<property name="serviceFactory" ref="xfire.serviceFactory" />
		<!-- 引用xfire.xml中的xfire实例 -->
		<property name="xfire" ref="xfire" />
	</bean>
	<bean id="WSPersonsInfoService" parent="baseWebService">
		<!-- 业务服务bean -->
		<property name="serviceBean" ref="WSPersonsInfoImp" />
		<!-- 业务服务bean的窄接口类 -->
		<property name="serviceClass"
			value="com.ws.yxjsry.IWSPersonsInfo" />
	</bean>
	<bean id="WSPersonsInfoImp"
		class="com.ws.yxjsry.WSPersonsInfoImp" />

</beans>


后来觉得要在classpath中放spring-beans.dtd文件太麻烦,就想到用spring2.x的schema方式,这样就不需要spring-beans.dtd文件了。方法是把<!DOCTYPE beans SYSTEM "spring-beans.dtd">去掉,把<beans>修改成
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">


当然,工程中用到的spring包要换成用2.0以上的,否则回报错
org.xml.sax.SAXParseException: Document is invalid: no grammar found.

org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".


问题总结:
问题关键是xfire1.2.6的XML定义格式是按照spring1.x格式的,而且dtd都是在网络上校验,所以在不能访问互联网的环境中就会报错。首先,需要把xfire.xml和customEditors.xml复制到xfire-servlet.xml中。
然后,
如果工程用的是spring1.x,就把spring-beans.dtd文件放在classpath目录下,修改DOCTYPE为<!DOCTYPE beans SYSTEM "spring-beans.dtd">

如果工程用的是spring2.x,就把<!DOCTYPE beans SYSTEM "spring-beans.dtd">去掉,把<beans>修改成
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">


附件中有xfire的包和spring-beans.dtd文件

1
0
分享到:
评论

相关推荐

    xfire1.2.6_plugin

    总结来说,"xfire1.2.6_plugin"是Eclipse平台上的一个强大工具,它将XFire的Web Services开发能力无缝整合到Eclipse环境中,让开发者能够在熟悉的开发环境中高效地进行Web Services的开发和测试。通过理解并充分利用...

    xfire-1.2.6.rar xfire-1.2.6.rar xfire-1.2.6.rar

    通过查看源代码,开发者可以深入理解XFire的工作机制,进行定制化开发,解决特定场景下的问题,或优化性能。源代码的开放性也是开源项目的一大优势,促进了技术的交流与进步。 再者,`xfire-distribution-1.2.6.zip...

    xfire1.2.6版本及依赖文件

    8. **依赖管理**: 提供的`xfire1.2.6_all`压缩包可能包含了所有必要的依赖文件,这方便开发者快速集成到项目中,避免了手动解决依赖问题的麻烦。 9. **文档和社区支持**: 虽然XFire 1.2.6相对较旧,但在其活跃时期...

    Xfire1.2.6版API手册.chm

    Xfire1.2.6版API手册.chmXfire1.2.6版API手册.chmXfire1.2.6版API手册.chmXfire1.2.6版API手册.chm

    XFire1.2.6完整版JAR包

    XFire1.2.6完整版JAR包是一款历史悠久的游戏服务器通信软件,它主要用于网络游戏的多人联机功能。XFire的出现,使得玩家能够轻松地与朋友们一起进行在线游戏,享受更加流畅、稳定的多人对战体验。这个版本是1.2.6,...

    XFire1.2.6

    在本压缩包“XFire1.2.6”中,包含的是XFire 1.2.6版本所需的全部jar文件,这些文件是开发者进行基于webservice开发的重要组成部分。 一、XFire简介 XFire是一个轻量级的Web服务实现,它通过简化API和快速的性能,...

    Spring2.0和XFire1.2.6整合案例

    1. **添加依赖**:首先,你需要在项目的类路径下包含Spring和XFire的相关jar文件。这些文件通常可以从Maven仓库或官方网站下载。在现代项目中,通常会使用Maven或Gradle等构建工具来管理依赖。 2. **配置Spring**:...

    xfire1.2.6 ws-security示例

    xfire1.2.6是早年间一个流行的开源SOAP服务框架,它允许开发者构建和消费Web服务。WS-Security(Web Services Security)是基于SOAP消息的安全标准,用于保护Web服务免受各种攻击,如篡改、伪造等。在这个示例中,...

    xfire1.2.6.jar

    去除xfire传递date类型的数据时值为null时的异常的jar包

    xfire-all-1.2.6 xfire所需的全部包

    同时,其优秀的兼容性使其能在多种操作系统环境下稳定工作,满足了不同用户的需求。 综上所述,Xfire 1.2.6不仅是一个通讯工具,更是一个游戏世界的社交中心。它通过强大的游戏集成、即时通讯和丰富的社区功能,...

    spring3.0整合Xfire1.2.6 开发webservice需要的jar包

    本篇将详细讲解如何利用Spring 3.0与Xfire 1.2.6进行集成,以开发高效的Web服务。 首先,让我们了解Spring 3.0。Spring 3.0是Spring框架的一个重大更新,引入了许多新特性和改进,如支持JSR-303 Bean Validation,...

    xfire_1.2.6.rar

    标题中的"xfire_1.2.6.rar"指的是Xfire的1.2.6版本,这是一个经过压缩的RAR文件格式,RAR是一种高效的数据压缩和归档工具,由Eugene Roshal开发,常用于存储和分发大型文件。 描述中的"xfire-distribution-1.2.6....

    xfire1.2.6源代码源文件

    xfire1.2.6 源代码 源文件 源程序。供调试、研究用。

    xfire-1.2.6所有资源--实例

    **XFire 1.2.6 - 所有资源与Web服务实例详解** XFire是一个开源的Java Web服务实现框架,它提供了强大的功能,用于构建和消费基于SOAP(Simple Object Access Protocol)的服务。XFire 1.2.6是这个框架的一个版本,...

    xfire 1.2.6 API帮助文档.rar

    Xfire 1.2.6 API帮助文档详尽地列出了所有可用的API接口、参数说明、返回值及示例代码,是开发者学习和应用API的关键参考资料。通过阅读和理解这份文档,开发者可以迅速上手,高效地开发出与Xfire平台集成的应用。 ...

    xfire-1.2.6 jar包

    在Web服务器环境下,它扮演着至关重要的角色,为开发和部署Web服务提供了必要的工具和支持。 XFire,全名Apache CXF前身,最初由Codehaus组织开发,后来成为Apache软件基金会的一个项目,更名为CXF。XFire的设计...

    xfire1.2.6+spring2.5整合

    本项目"xfire1.2.6+spring2.5整合"是将XFire 1.2.6与Spring 2.5这两个开源框架进行融合,以实现更高效的服务导向架构。下面将详细解释这两个框架以及它们整合的意义和方法。 XFire是一个基于Java的Web服务框架,它...

    XFire1.2.6完整JAR包

    xfire-distribution-1.2.6.zip

    XFire 1.2.6调用Web Service的几种方法

    XFire 1.2.6 调用 Web Service 的几种方法 XFire 1.2.6 是一个流行的开源 Web 服务框架,提供了多种调用 Web 服务的方法。了解这些方法对于开发高效、可靠的 Web 服务客户端非常重要。本文将详细介绍 XFire 1.2.6 ...

Global site tag (gtag.js) - Google Analytics