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响应请求的过程非常独特,它增强了request、response和session的功能,并通过Pipeline流程机制来处理请求,这种方式使得请求处理更加灵活。Webx还提供了异常处理机制和开发模式工具,以帮助开发者处理各种细节...
Webx框架的文档详细介绍了该框架的设计理念、历史、优势以及与Spring框架的集成等方面。文档内容主要分为两大部分:Webx框架概览和Webx基础设施服务。 在Webx框架概览部分,首先对Webx框架进行了整体介绍,包括其...
1. 数据解析器的角色:数据解析器是Webx与数据库交互的关键,它封装了数据访问逻辑,可以高效地处理SQL查询、事务管理和结果集转换。 2. 解析器的类型:Webx支持多种数据解析器,包括基于JDBC的解析器、ORM框架如...
Filter用于处理请求和响应,可以插入到请求/响应链中,通过设置规则决定哪些请求需要被过滤。它具有明确的用途和工作原理,并且有其自身限制。Webx对Filter也提供了定制化的空间,以便能够根据应用需求进行扩展。 ...
WebX提供了内置的表单处理机制,支持POST和GET请求方式。开发者可以在Action中定义处理表单数据的方法,WebX会自动将表单字段映射到Action的属性。表单验证通常在Action的`validate()`方法中进行,可以自定义验证...
- **动态代理**:通过动态代理机制,Webx能自动处理请求和响应,减少手动编码的工作量。 - **强大的表单处理**:Webx提供了一套完整的表单验证和处理机制,支持自定义验证规则。 - **灵活的URL映射**:开发者可以...
通过分析这些代码,你可以看到WebX如何处理请求、如何与数据库交互以及如何展示结果。 总的来说,WebX入门指南示例程序是一个很好的学习起点,通过实践和理解这个示例,你将能够掌握WebX的基本概念和用法,为进一步...
- **执行流程**:请求处理过程通过Pipeline来管理,包括URI解析、请求上下文处理等多个环节,确保了请求的高效处理。 ### 总结 Webx3.0框架在继承了Webx2的优势基础上,进一步加强了与Spring框架的整合,引入了许多...
通过这种方式,Webx能够利用Spring所提供的成熟特性,如依赖注入(DI)和面向切面编程(AOP)等,从而极大地简化了开发过程。 - **层次化**:为了更好地组织代码并提高可维护性,Webx采用了分层架构。这种设计不仅有...
Webx-SpringExt是Webx框架的一个扩展,它与Spring框架进行了深度集成,旨在提供更高效、更灵活的Web应用程序开发环境。Eclipse是一个广泛使用的Java集成开发环境(IDE),而这里的"webx-springExt整合eclipse插件"是...
- **Pipeline流程机制**:采用管道模型处理请求,每个环节可以执行特定任务,如身份验证、数据校验等。 - **异常处理机制**:提供了一套完善的异常捕获和处理方案,帮助开发者更好地管理程序运行时可能出现的问题。 ...
Webx还具备页面驱动的设计理念,与“约定胜于配置”的思想相契合,使得Webx在处理页面布局和流程上具备优势。WebxTurbine作为Webx框架的页面驱动部分,提供了页面布局的指导和基本流程的处理方法,以及依赖注入的...
10. **日志记录与异常处理**:WebX 内置了日志系统和异常处理机制,便于调试和问题排查。 通过学习WebX框架,开发者可以快速掌握企业级Web应用的开发流程,提高开发效率。对于"petstore-webx3"中的PetStore应用,它...
llerServlet 是 Webx 框架的核心组件,它负责处理所有以 .htm 和 .do 结尾的请求。通过设置 `init-param` 中的 `initAllServices` 参数为 `true`,我们确保在启动时初始化所有服务。 3.1.2. 创建页面 接下来,我们...
WEBX是阿里巴巴的内部框架,“就是把页面与Service层之间的一些Servlet等公共的东西抽象出来,提供相应的服务以提高开发效率(《接口测试之Webx简介》—何晓峰 )”,可以看出,webx和传统的servlet-action模式的...
• 2004年11月,Webx 2.0和Spring框架整合。 • 从那以后,Webx 2.0一直在进化,但没有作根本性的改动。 • 2010年,Webx 3.0发布。Webx 3.0抛弃了Webx 2.0中过时的、从Turbine中发展而来的 Service框架,直接采用...
- **Pipeline流程机制**:定义了一个请求处理的管道,通过一系列过滤器(Filter)来处理请求和响应。 - **异常处理机制**:提供了一套完善的异常捕获和处理机制,确保程序的健壮性。 - **开发模式工具**:提供了一些...
Webx还支持自定义拦截器,允许在请求处理前后执行特定的逻辑,增强了系统的灵活性和可扩展性。 Webx框架中的模型组件通常用于封装业务逻辑和数据,它可以通过接口与数据库或者其他数据源交互,实现数据的存取。视图...
**淘宝WEBX框架详解** 淘宝WEBX框架是一个专为大型电子商务平台设计的高效、可扩展的Web应用程序开发框架。这个框架由阿里巴巴技术部门研发,旨在提高开发效率,保证系统的稳定性和可维护性,同时降低新手入门的...