首先是遇到的问题:
在 struts2 中
我用 http://localhost:88/sysmanage/faqInfo.action?faq.id=20 的url提交,按照正常的ognl解析 出现以下结果
那么原因:
我的实体类的定义如下
一个泛型结构
当OGNL在解析ID的时候 id字段的类型仍然为Object 这样id就不会当成基本数据类型来解析 产生如图所示结果
详细一点:
下面来修改ognl的源码来解决这个问题(当然,应该不是最优的方案)
打开 OgnlRuntime抽象类,修改两处
public static Method getAppropriateMethod( OgnlContext context, Object source, Object target, String methodName, String propertyName, List methods, Object[] args, Object[] actualArgs )
{
Method result = null;
Class[] resultParameterTypes = null;
if (methods != null) {
for (int i = 0, icount = methods.size(); i < icount; i++) {
Method m = (Method)methods.get(i);
Class[] mParameterTypes = getParameterTypes(m);
//Generic converted Type
Class[] mGenericparameterTypeString = {java.lang.String.class};
if ( areArgsCompatible(args, mParameterTypes) && ((result == null) || isMoreSpecific(mParameterTypes, resultParameterTypes)) ) {
if(areArgsCompatibleGeneric(args,mGenericparameterTypeString)){
if(getConvertedTypesGeneric( context, target, m, propertyName, args, actualArgs))
result = m;
}else{
result = m;
resultParameterTypes = mParameterTypes;
System.arraycopy(args, 0, actualArgs, 0, args.length);
for (int j = 0; j < mParameterTypes.length; j++) {
Class type = mParameterTypes[j];
if (type.isPrimitive() && (actualArgs[j] == null)) {
actualArgs[j] = getConvertedType(context, source, result, propertyName, null, type);
}
}
}
}
}
}
if ( result == null ) {
result = getConvertedMethodAndArgs( context, target, propertyName, methods, args, actualArgs );
}
return result;
}
由于要取到泛型的类型,增加一个方法,作用是根据泛型来转换传过来的参数使其与定义的实体对象匹配
public static boolean getConvertedTypesGeneric( OgnlContext context, Object target, Member member, String propertyName, Object[] args, Object[] newArgs)
{
boolean result = false;
// get Generic Type
Class[] parameterTypes = {(Class) ((ParameterizedType) target.getClass().getGenericSuperclass()).getActualTypeArguments()[0]};
if (parameterTypes.length == args.length) {
result = true;
for (int i = 0, ilast = parameterTypes.length - 1; result && (i <= ilast); i++) {
Object arg = args[i];
Class type = parameterTypes[i];
if (isTypeCompatible(arg, type)) {
newArgs[i] = arg;
} else {
Object v = getConvertedType(context, target, member, propertyName, arg, type);
if (v == OgnlRuntime.NoConversionPossible) {
result = false;
} else {
newArgs[i] = v;
}
}
}
}
return result;
}
这里增加一个对泛型对象的处理
这样基本能解决这次问题而不影响到其他的部分,当然 也希望ognl项目组在后续版本增加对这个地方的处理
这是解决后的截图
分享到:
相关推荐
4. **bug修复**:此版本通常会修复前一版本中发现的已知问题,提高整体的稳定性和可靠性。 5. **文档更新**:官方源码中通常会包含详细的设计文档和API参考,帮助开发者理解其内部工作原理和如何有效地使用。 **三...
Struts2是一个非常著名的Java Web框架,它基于MVC(Model-View-Controller)设计模式,为开发人员提供了构建企业级应用的强大工具。Struts2官方中文帮助文档是开发者了解和学习该框架的重要参考资料,其最新修复Bug...
然后,需要创建一个新的 Java 项目,并添加 WebWork 框架的依赖项。最后,编写 HelloWorld 程序,以验证 WebWork 框架的安装是否成功。 Action Action 是 WebWork 框架的核心组件之一,负责处理用户请求和响应。...
"webwork2.2.4%2Bspring%2Bhibernate"可能是一个包含了整合WebWork 2.2.4、Spring和Hibernate配置的子目录或文件,这通常包括配置文件(如web.xml、struts-config....,帮助开发者快速搭建一个整合了这三个框架的项目...
该项目名为"struts2等一些技术模仿当当网的一个小项目",旨在通过使用Struts2、jQuery和JavaScript等技术,构建一个类似于当当网的在线购物平台。Struts2是一个流行的Java Web框架,它为开发人员提供了一种组织应用...
具体到struts-2.3.16版本,这是Struts2的一个稳定版本,包含了多个组件和修复的bug,旨在提供更高效、更安全的开发环境。 核心jar包是Struts2框架的基础,主要包括以下几个关键组件: 1. **struts2-core.jar**:这...
在Spring和Mybatis中,OGNL常用于表达式语言,可以方便地在视图层获取模型中的数据,或者在配置文件中动态计算值。 以上这些库的组合使用,构成了一个完整的Java企业级应用开发环境,它们共同协作,实现了从数据...
Struts是Apache软件基金会下的一个开源项目,是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。这个框架主要目的是提供一个结构化的、可扩展的平台,帮助开发者构建更易于维护的Web应用程序。在...
Struts 2.2.1.1是该框架的一个特定版本,此版本主要针对Struts 2.1进行了一些改进和增强,旨在提高性能和稳定性,同时也可能修复了之前版本中发现的安全漏洞和bug。 在"struts-2.2.1.1-all.rar"这个压缩包中,包含...
Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它由Apache软件基金会维护。此框架的主要目标是提供一个结构化的、可扩展的平台,用于开发更加整洁、易于维护的Java应用程序。Struts2的...
描述中的“只是基础的架包,有待更新”意味着这些JAR包可能包含了SSH框架的基本版本,可能不包含最新的特性或者修复的bug。开发者在实际使用时,需要根据项目需求和框架的更新日志,选择合适且稳定的版本进行导入。...