`
tangqii
  • 浏览: 7799 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类

(原创)最近发现OGNL的一个BUG 或者叫不足吧,这里贴出来希望OGNL项目组日后完善

阅读更多

首先是遇到的问题:
在 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 楼 tangqii 2010-04-20  
joeyhacker 写道
OGNL以前是有不少问题,比如向它传个数字0或0.0就是死活不认。 struts2.1.8应该好了

可能就是这类 把基础类型包装成了引用类型导致的问题,可以跟踪进去看看。
3 楼 joeyhacker 2010-04-19  
OGNL以前是有不少问题,比如向它传个数字0或0.0就是死活不认。 struts2.1.8应该好了
2 楼 tangqii 2010-04-15  
魔力猫咪 写道
从头到尾没搞明白搞的什么。OGNL到底有什么错误了?

你如果用泛型主键的话,是取不到对应的key的,而是一个key的数组。
1 楼 魔力猫咪 2010-04-15  
从头到尾没搞明白搞的什么。OGNL到底有什么错误了?

相关推荐

    ognl-2.6.11.jar 官方源码

    4. **bug修复**:此版本通常会修复前一版本中发现的已知问题,提高整体的稳定性和可靠性。 5. **文档更新**:官方源码中通常会包含详细的设计文档和API参考,帮助开发者理解其内部工作原理和如何有效地使用。 **三...

    struts2官方中文帮助文档最新修复Bug版(绝版)

    Struts2是一个非常著名的Java Web框架,它基于MVC(Model-View-Controller)设计模式,为开发人员提供了构建企业级应用的强大工具。Struts2官方中文帮助文档是开发者了解和学习该框架的重要参考资料,其最新修复Bug...

    WebWork完全教程.doc

    然后,需要创建一个新的 Java 项目,并添加 WebWork 框架的依赖项。最后,编写 HelloWorld 程序,以验证 WebWork 框架的安装是否成功。 Action Action 是 WebWork 框架的核心组件之一,负责处理用户请求和响应。...

    webwork的jar包

    "webwork2.2.4%2Bspring%2Bhibernate"可能是一个包含了整合WebWork 2.2.4、Spring和Hibernate配置的子目录或文件,这通常包括配置文件(如web.xml、struts-config....,帮助开发者快速搭建一个整合了这三个框架的项目...

    struts2等一些技术模仿当当网的一个小项目

    该项目名为"struts2等一些技术模仿当当网的一个小项目",旨在通过使用Struts2、jQuery和JavaScript等技术,构建一个类似于当当网的在线购物平台。Struts2是一个流行的Java Web框架,它为开发人员提供了一种组织应用...

    struts2 框架的核心jar包(struts-2.3.16版本)

    具体到struts-2.3.16版本,这是Struts2的一个稳定版本,包含了多个组件和修复的bug,旨在提供更高效、更安全的开发环境。 核心jar包是Struts2框架的基础,主要包括以下几个关键组件: 1. **struts2-core.jar**:这...

    spring及mybatis相关的jar包lib.rar

    在Spring和Mybatis中,OGNL常用于表达式语言,可以方便地在视图层获取模型中的数据,或者在配置文件中动态计算值。 以上这些库的组合使用,构成了一个完整的Java企业级应用开发环境,它们共同协作,实现了从数据...

    struts-1.3.8-all&1.3.10

    Struts是Apache软件基金会下的一个开源项目,是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。这个框架主要目的是提供一个结构化的、可扩展的平台,帮助开发者构建更易于维护的Web应用程序。在...

    struts-2.2.1.1-all.rar

    Struts 2.2.1.1是该框架的一个特定版本,此版本主要针对Struts 2.1进行了一些改进和增强,旨在提高性能和稳定性,同时也可能修复了之前版本中发现的安全漏洞和bug。 在"struts-2.2.1.1-all.rar"这个压缩包中,包含...

    Struts2最新jar包2.5.17

    Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它由Apache软件基金会维护。此框架的主要目标是提供一个结构化的、可扩展的平台,用于开发更加整洁、易于维护的Java应用程序。Struts2的...

    ssh架包下载

    描述中的“只是基础的架包,有待更新”意味着这些JAR包可能包含了SSH框架的基本版本,可能不包含最新的特性或者修复的bug。开发者在实际使用时,需要根据项目需求和框架的更新日志,选择合适且稳定的版本进行导入。...

Global site tag (gtag.js) - Google Analytics