`
sillycat
  • 浏览: 2537799 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

xfire后续问题补充

    博客分类:
  • SOA
阅读更多
xfire后续问题补充

问题一:xfire的方法中,需要知道request,从request取出client访问者的IP
webservice最终是基于HTTP的,所以也是一个HTTP请求到
<bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false"
    abstract="true">
<property name="serviceFactory" ref="xfire.serviceFactory"/>
<property name="xfire" ref="xfire"/>
</bean>
最终是由XFireExporter在处理这个HTTP请求
再看源码
public class XFireExporter
        extends ServiceBean
        implements Controller, ServletContextAware
其实所谓的XFireExporter其实是spring的一个controller实现,所以里面是可以得到request的。

其中几个重要类的关系如下:
XFireExporter ---> XFireServletControllerAdapter --->XFireServletController
在一个HTTP请求发生的时候,就将当前的request和response放到了
private static ThreadLocal requests = new ThreadLocal();
private static ThreadLocal responses = new ThreadLocal();
ThreadLocal变量中,在XFireServletController上又提供了static方法取得这个变量。
所以,参考网上查找到得资料。

我们只需要在我们的webService的server端上添加如下方法:
HttpServletRequest request = XFireServletController.getRequest();
String ip = RequestUtil.getIpAddr(request);
System.out.println(ip);

其中RequestUtil.java是一个从request取得ip的积累,内容如下:
package com.sillycat.core.commons.utils;

import javax.servlet.http.HttpServletRequest;

public class RequestUtil {

public static String getIpAddr(HttpServletRequest request) {
   String ip = request.getHeader("x-forwarded-for");
   if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
   }
   if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
   }
   if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();
   }
   return ip;
}

}


问题二:xfire和spring-mvc-2.5.6的配置冲突

公司在使用spring-mvc的时候,使用了controller的默认view名字设置(具体参考spring的文档),文档上的配置如下:
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator" />

同时项目中又实用了xfire的简单映射配置(具体参考xfire文档)
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
<bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter"
lazy-init="false" abstract="true">
<property name="serviceFactory" ref="xfire.serviceFactory" />
<property name="xfire" ref="xfire" />
</bean>
<bean name="ProjectXFire" parent="baseWebService">
<property name="serviceBean" ref="projectXFireImpl"/>
<property name="serviceClass" value="cn.sccl.icpmis.requirement.webService.ProjectXFire"/>
</bean>
启动后,系统报错如下:
2008-12-13 15:47:52 org.apache.catalina.core.StandardContext listenerStart
严u-28211 : Exception sending context initialized event to listener instance of class cn.sccl.common.web.StartupListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping#0' defined in ServletContext resource [/WEB-INF/classes/core-context.xml]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler [TaskSearchServiceEn] to URL path [/xfireexporter*]: There is already handler [org.codehaus.xfire.spring.remoting.XFireExporter@11c19e6] mapped.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at cn.sccl.common.web.StartupListener.contextInitialized(StartupListener.java:20)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.IllegalStateException: Cannot map handler [TaskSearchServiceEn] to URL path [/xfireexporter*]: There is already handler [org.codehaus.xfire.spring.remoting.XFireExporter@11c19e6] mapped.
at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:304)
at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:276)
at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82)
at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:57)
at org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:119)
at org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:69)
at org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73)
at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:70)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:350)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1331)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
... 30 more

后来找到了是由于这两个配置的冲突导致的。查找spring源码
特别关注这几个类:
ControllerClassNameHandlerMapping --->AbstractControllerUrlHandlerMapping --->ControllerTypePredicate
其中的方法
protected boolean isControllerType(Class beanClass) {
这是判断spring容器中的bean是否是一个controller的,如果是,那么就将把view名字默认映射出去。每个xfire的配置都是基于XFireExporter的,都被认为是一个
controller,所以都按照相同的名字/xfireexporter*映射出去。所以就会报错。
我修改的办法比较笨,自己拷贝 ControllerClassNameHandlerMapping 类,增加了一个方法
@Override
public boolean isControllerType(Class beanClass) {
boolean flag = (Controller.class.isAssignableFrom(beanClass) || ThrowawayController.class
    .isAssignableFrom(beanClass));
if (org.codehaus.xfire.spring.remoting.XFireExporter.class.isAssignableFrom(beanClass)) {
   flag = false;
}
return flag;
}
将基类里面的方法override了,然后修改spring的配置文件为:
<bean class="cn.sccl.common.web.CustomerControllerClassNameHandlerMapping" />
<bean class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator" />

问题解决了。
1
0
分享到:
评论
1 楼 hbzjzh 2011-02-26  
华仔 你太帅了!

相关推荐

    Xfire调用webservice无法传递参数问题

    在本文中,我们将深入探讨Xfire调用Web服务时遇到的参数传递问题以及解决策略。 首先,让我们了解Web服务的基本概念。Web服务基于SOAP(Simple Object Access Protocol)协议,通过HTTP协议进行通信,使得不同的...

    xfire

    xfire是一款历史悠久的在线游戏平台,它在2004年由GameSpy Industries开发并发布,主要功能是为玩家提供即时通讯、好友列表、游戏内聊天和游戏统计等功能,旨在增强玩家的游戏体验。xfire 1.26是该平台的一个特定...

    xfire依赖jar包

    xfire是一个早期流行的开源Web服务框架,主要用于构建SOAP(简单对象访问协议)和RESTful(Representational State Transfer)服务。这个框架使得Java开发者能够轻松地创建、部署和消费Web服务。xfire依赖于一系列的...

    Xfire API,Xfire帮助文档

    为了更好地理解和使用Xfire API,开发者可以参考提供的帮助文档,文档中通常会包含API接口的详细说明、示例代码以及常见问题解答。对于初学者,理解每个API方法的功能和参数、以及如何正确构造HTTP请求是非常重要的...

    Xfire调用webservice无法接收到参数问题解决

    标题"Xfire调用webservice无法接收到参数问题解决"指出的核心问题是:当使用Xfire作为客户端调用Web服务时,服务端无法正确接收到传递的参数。这可能是由于多种原因引起的,如: 1. **XML序列化与反序列化问题**:...

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

    《Xfire全方位解析:1.2.6版本的全面探讨》 Xfire,这款曾经在游戏社区中广受欢迎的即时通讯软件,以其独特的游戏整合功能和社交特性,为玩家提供了便捷的游戏内通信和社区交流平台。本文将深入探讨Xfire 1.2.6这一...

    Xfire-v1.99 XFire最高版本

    **XFire v1.99:WebService开发框架详解** XFire,全称为XFire Integration Library,是一个基于Java的开源框架,专门用于构建和部署Web服务。这个“XFire最高版本”指的是XFire项目的最终或最优化的版本,它提供了...

    XFire创建的WebService

    【XFire创建的WebService】是基于Java平台的开源框架,用于构建和消费Web服务。它在Web服务领域提供了一个轻量级、高性能的选择,尤其适合快速开发。在本例中,我们将探讨如何使用XFire来创建一个简单的WebService...

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

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

    Xfire的client.zip_Xfire客户端代码_webservice

    在本案例中,"Xfire的client.zip"是一个包含了Xfire客户端代码的压缩包,主要用于调用Web服务。 Xfire客户端代码是实现与Xfire服务器通信的代码库,它可能包含了多种语言的实现,如Java、C#或Python等。这些代码...

    XFire--Webservice入门xfire

    XFire--Webservice入门xfire

    xfire myeclipse10包

    【xfire myeclipse10包】是一款专为MyEclipse10集成开发环境设计的XFire插件安装包。XFire是一款强大的Java Web服务框架,它提供了对Web服务的全面支持,包括创建、部署和消费Web服务的能力。在MyEclipse这样的集成...

    xfire与cxf包冲突解决方案

    1、以下四个类调用了XmlSchema-1.1.jar包 因与cxf包xmlschema-core-*.jar... xfire-all-1.2.6-incomplete.jar 替换 xfire-all-1.2.6.jar 3、XmlSchema-1.1.jar 可以与 xmlschema-core-*.jar 共存避开同路径同名类冲突

    Xfire案例,webserver——Xfire案例

    Xfire是一款曾经非常流行的社交软件,专为游戏爱好者设计,允许玩家在玩游戏时与朋友聊天、分享游戏状态和成就。这个“Xfire案例,webserver——Xfire案例”的主题可能涉及Xfire服务端的实现,特别是它如何作为web...

    spring 集成xfire 比较好的一种方式

    - 确保 XFire 版本与 Spring 版本兼容,以避免兼容性问题。 - 测试时,可以使用 SOAP UI 或类似的工具来调用 Web 服务,验证其功能。 - 考虑使用 CXF 或其他现代的 Web 服务框架,因为 XFire 已经不再活跃维护,而 ...

    xfire所需jar包

    XFire,全称为XML Fire,是一款历史悠久的开源Java框架,主要用作服务导向架构(SOA)中的Web服务实现工具。它允许开发者快速构建、部署和管理基于HTTP的服务,支持SOAP和RESTful通信协议。在Java开发中,XFire通过...

    java使用XFire调用webService接口

    "Java 使用 XFire 调用 webService 接口" 在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单...

    Java使用XFire调用WebService接口

    6. **异常处理**:在调用Web服务时,可能会遇到网络问题或服务端错误,XFire会将这些异常封装成特定的Java异常,方便开发者捕获并处理。 7. **日志和调试**:为了调试和优化,XFire支持日志记录,开发者可以通过...

    xfire https

    这通常涉及到设置SSLSocketFactory,指定信任的证书,以及处理可能出现的证书链问题。如果服务端需要客户端验证,还需要提供客户端证书。 4. **调用Web Service**:生成客户端代理后,你可以通过代理类的方法调用...

Global site tag (gtag.js) - Google Analytics