`
goon
  • 浏览: 183848 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

webx处理请求与Spring aop

    博客分类:
  • webx
 
阅读更多

webx在启动时通过:

com.alibaba.citrus.webx.servlet.WebxFrameworkFilter.init()==>ServletContext. getAttribute(attrName)

获取WebxComponentsContext。 

后续调用过程:

WebxRootControllerImpl. handleRequest()

 

getComponents().findMatchedComponent(path).getWebxController().service(requestContext)

 

在service中:

 

PipelineInvocationHandle. Invoke()==>valve.invoke(this)

 

valve就是在pipeline中配置的阀门。

 

 

 

由于我们需要在screen层加一层aop:

<aop:config>
		<aop:aspect ref="requestParamCheck">
			<aop:pointcut id="screenPointcut"
				expression="execution(public * com.x.z.*.module.screen.*.*(..))" />
			<aop:before method="check" pointcut-ref="screenPointcut" />
		</aop:aspect>
	</aop:config>

 这时,如果screen实现的有接口,则screen所对应的bean应该是通过jdk动态代理创建的。例如:LoginScreen implements ILogin

 

//空接口
public interface ILogin {

}

 那边LoginScreen的bean实例:org.springframework.aop.framework.JdkDynamicAopProxy@a634f0e

这时就会出现异常:

Failed to process request /loginScreen/abc.htm, the r
oot cause was UnadaptableModuleException: Could not adapt object to module: type=screen, name=LoginS
creen, class=class com.sun.proxy.$Proxy8

 

 抛出异常的代码:

 

// 从factory中装载
        Object moduleObject = null;
        Module module = null;

        for (ModuleFactory factory : factories) {
            moduleObject = factory.getModule(moduleType, moduleName);

            if (moduleObject != null) {
                break;
            }
        }
//此时  moduleObject 被赋值为LoginScreen的jdk动态代理实例org.springframework.aop.framework.JdkDynamicAopProxy@a634f0e
        // 通过适配器转换接口
        if (moduleObject != null) {
            if (moduleObject instanceof Module) {
                module = (Module) moduleObject; // 假如moduleObject直接实现了接口
            } else {
                for (ModuleAdapterFactory adapter : adapters) {
                    module = adapter.adapt(moduleType, moduleName, moduleObject);

                    if (module != null) {
                        break;
                    }
                }
            }
        }

        if (module == null) {
            if (moduleObject != null) {
                throw new UnadaptableModuleException("Could not adapt object to module: type=" + moduleType + ", name="
                                                     + moduleName + ", class=" + moduleObject.getClass());
            }
        }

 

 应该是 adapter.adapt(moduleType, moduleName, moduleObject)出现了问题

 

public Module adapt(String type, String name, Object moduleObject) {
        if (!isAdaptableType(type)) {
            return null;
        }

        Class<?> moduleClass = moduleObject.getClass();
        Map<String, Method> handlers = getEventHandlers(moduleClass);

        if (handlers == null) {//debug发现,是这里返回了null
            return null;
        }

        ModuleInfo moduleInfo = new ModuleInfo(type, name);
        FastClass fc = FastClass.create(moduleClass);
        Map<String, MethodInvoker> fastHandlers = createHashMap(handlers.size());

        for (Map.Entry<String, Method> entry : handlers.entrySet()) {
            FastMethod fm = fc.getMethod(entry.getValue());
            fastHandlers.put(entry.getKey(), getMethodInvoker(fm, moduleInfo, isEventHandlerSkippable()));
        }

        FastMethod preHandler = getFastMethod(fc, PRE_HANDLER);
        FastMethod postHanlder = getFastMethod(fc, POST_HANDLER);

        AbstractModuleEventAdapter adapter = createAdapter(moduleObject,
                                                           fastHandlers,
                                                           getMethodInvoker(preHandler, moduleInfo, false),
                                                           getMethodInvoker(postHanlder, moduleInfo, false));

        try {
            // 注入并初始化adapter(不是注入moduleObject,后者取决于factory的设置)
            autowireAndInitialize(adapter, context, AbstractBeanDefinition.AUTOWIRE_AUTODETECT, type + "." + name);
        } catch (Exception e) {
            throw new ModuleLoaderException("Failed to configure module adapter", e);
        }

        return adapter;
    }

  if (handlers == null) {//debug发现,是这里返回了null
            return null;
        }
再看看getEventHandlers():

/** 取得事件处理方法。 */
    private Map<String, Method> getEventHandlers(Class<?> moduleClass) {
        Map<String, Method> handlers = null;

        for (Method method : moduleClass.getMethods()) {
            if (checkMethod(method)) {
                String methodName = method.getName();

                // doXyz()
                if (methodName.length() > 2 && methodName.startsWith("do")//对以do开头的方法做map,以处理请求
                    && Character.isUpperCase(methodName.charAt(2))) {
                    String eventName = toCamelCase(methodName.substring(2));

                    // default handler: doPerform()
                    if (DEFAULT_EVENT.equals(eventName)) {
                        eventName = null;
                    }

                    if (handlers == null) {
                        handlers = createHashMap();
                    }

                    handlers.put(eventName, method);
                }
            }
        }

        return handlers;
    }

 由于jdk动态代理产生的实例包含的方法来源于其所实现的接口,而ILogin接口中没有任何方法,更不会有以do开头的方法,所以getEventHandlers()返回null,导致异常。。

解决方案:

   如果不想对screen中的所有do*()都定义接口,那么可以采用cglib做代理,只需要保证screen没有实现任何接口,spring就会自动使用cglib做代理,cglib是通过创造子类来实现代理的,所以代理子类肯定有do*()方法,getEventHandlers()就会返回do开头的方法map,就能够正常处理请求。

 

 

 

分享到:
评论

相关推荐

    webx框架指南

    Webx响应请求的过程非常独特,它增强了request、response和session的功能,并通过Pipeline流程机制来处理请求,这种方式使得请求处理更加灵活。Webx还提供了异常处理机制和开发模式工具,以帮助开发者处理各种细节...

    webx3文档——web开发

    Webx框架的文档详细介绍了该框架的设计理念、历史、优势以及与Spring框架的集成等方面。文档内容主要分为两大部分:Webx框架概览和Webx基础设施服务。 在Webx框架概览部分,首先对Webx框架进行了整体介绍,包括其...

    webx总结

    1. 数据解析器的角色:数据解析器是Webx与数据库交互的关键,它封装了数据访问逻辑,可以高效地处理SQL查询、事务管理和结果集转换。 2. 解析器的类型:Webx支持多种数据解析器,包括基于JDBC的解析器、ORM框架如...

    webx_guide

    Filter用于处理请求和响应,可以插入到请求/响应链中,通过设置规则决定哪些请求需要被过滤。它具有明确的用途和工作原理,并且有其自身限制。Webx对Filter也提供了定制化的空间,以便能够根据应用需求进行扩展。 ...

    webx总结 项目实践总结

    WebX提供了内置的表单处理机制,支持POST和GET请求方式。开发者可以在Action中定义处理表单数据的方法,WebX会自动将表单字段映射到Action的属性。表单验证通常在Action的`validate()`方法中进行,可以自定义验证...

    Webx及框架简介

    - **动态代理**:通过动态代理机制,Webx能自动处理请求和响应,减少手动编码的工作量。 - **强大的表单处理**:Webx提供了一套完整的表单验证和处理机制,支持自定义验证规则。 - **灵活的URL映射**:开发者可以...

    WebX入门指南示例程序

    通过分析这些代码,你可以看到WebX如何处理请求、如何与数据库交互以及如何展示结果。 总的来说,WebX入门指南示例程序是一个很好的学习起点,通过实践和理解这个示例,你将能够掌握WebX的基本概念和用法,为进一步...

    Webx介绍_PDF

    - **执行流程**:请求处理过程通过Pipeline来管理,包括URI解析、请求上下文处理等多个环节,确保了请求的高效处理。 ### 总结 Webx3.0框架在继承了Webx2的优势基础上,进一步加强了与Spring框架的整合,引入了许多...

    webx3 PDF(阿里巴巴 前端web框架)

    通过这种方式,Webx能够利用Spring所提供的成熟特性,如依赖注入(DI)和面向切面编程(AOP)等,从而极大地简化了开发过程。 - **层次化**:为了更好地组织代码并提高可维护性,Webx采用了分层架构。这种设计不仅有...

    webx-springExt整合eclipse插件

    Webx-SpringExt是Webx框架的一个扩展,它与Spring框架进行了深度集成,旨在提供更高效、更灵活的Web应用程序开发环境。Eclipse是一个广泛使用的Java集成开发环境(IDE),而这里的"webx-springExt整合eclipse插件"是...

    WEBX3.0框架指南(PDF版)

    - **Pipeline流程机制**:采用管道模型处理请求,每个环节可以执行特定任务,如身份验证、数据校验等。 - **异常处理机制**:提供了一套完善的异常捕获和处理方案,帮助开发者更好地管理程序运行时可能出现的问题。 ...

    Webx3_Guide_Book.pdf

    Webx还具备页面驱动的设计理念,与“约定胜于配置”的思想相契合,使得Webx在处理页面布局和流程上具备优势。WebxTurbine作为Webx框架的页面驱动部分,提供了页面布局的指导和基本流程的处理方法,以及依赖注入的...

    webx

    10. **日志记录与异常处理**:WebX 内置了日志系统和异常处理机制,便于调试和问题排查。 通过学习WebX框架,开发者可以快速掌握企业级Web应用的开发流程,提高开发效率。对于"petstore-webx3"中的PetStore应用,它...

    创建简单的WEBX应用

    llerServlet 是 Webx 框架的核心组件,它负责处理所有以 .htm 和 .do 结尾的请求。通过设置 `init-param` 中的 `initAllServices` 参数为 `true`,我们确保在启动时初始化所有服务。 3.1.2. 创建页面 接下来,我们...

    webx2.7绿色安装

    WEBX是阿里巴巴的内部框架,“就是把页面与Service层之间的一些Servlet等公共的东西抽象出来,提供相应的服务以提高开发效率(《接口测试之Webx简介》—何晓峰 )”,可以看出,webx和传统的servlet-action模式的...

    Webx3_Guide_Book.pdf 用户指南

    • 2004年11月,Webx 2.0和Spring框架整合。 • 从那以后,Webx 2.0一直在进化,但没有作根本性的改动。 • 2010年,Webx 3.0发布。Webx 3.0抛弃了Webx 2.0中过时的、从Turbine中发展而来的 Service框架,直接采用...

    Webx3 Guide Book pdf

    - **Pipeline流程机制**:定义了一个请求处理的管道,通过一系列过滤器(Filter)来处理请求和响应。 - **异常处理机制**:提供了一套完善的异常捕获和处理机制,确保程序的健壮性。 - **开发模式工具**:提供了一些...

    通用WEB框架 Webx.zip

    Webx还支持自定义拦截器,允许在请求处理前后执行特定的逻辑,增强了系统的灵活性和可扩展性。 Webx框架中的模型组件通常用于封装业务逻辑和数据,它可以通过接口与数据库或者其他数据源交互,实现数据的存取。视图...

    淘宝WEBX框架详解

    **淘宝WEBX框架详解** 淘宝WEBX框架是一个专为大型电子商务平台设计的高效、可扩展的Web应用程序开发框架。这个框架由阿里巴巴技术部门研发,旨在提高开发效率,保证系统的稳定性和可维护性,同时降低新手入门的...

Global site tag (gtag.js) - Google Analytics