package cn; public class A { private Integer id; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; A other = (A) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
<% A a1 = new A(); a1.setId(1); A a2 = new A(); a2.setId(2); List<A> list = new ArrayList(); list.add(a1); list.add(a2); request.setAttribute("list", list); %> <s:iterator value="#request.list" var="a"> <s:property value="#a in #request.list"/><br/> </s:iterator> </body> </html>
期望输出:
true
true
但是实际是:
true
如果配置struts.el.throwExceptionOnFailure=true,那么会得到如下异常:
invalid comparison: cn.A and cn.A - Class: ognl.OgnlOps
File: OgnlOps.java
Method: compareWithConversion
原因在其ognl LanguageGuide 中也说了:
写道
The ordering operators compare with compareTo() if their arguments are non-numeric and implement Comparable; otherwise, the arguments are interpreted as numbers and compared numerically. The in operator is not from Java; it tests for inclusion of e1 in e2, where e2 is interpreted as a collection. This test is not efficient: it iterates the collection. However, it uses the standard OGNL equality test.
它通过对象的compareTo去比较,且此处的in不是来自Java语言的。
所以如果你的对象没有实现Comparable,那么比较就会出问题,解决方案是:
1、实现Comparable来比较
2、使用集合本身自带的contains
其实ognl完全可以规避这个问题,通过改造ognl.OgnlOps.compareWithConversion方法:
原来是:
case NONNUMERIC: if ( ( t1 == NONNUMERIC ) && ( t2 == NONNUMERIC ) ) { if ( ( v1 instanceof Comparable ) && v1.getClass().isAssignableFrom( v2.getClass() ) ) { result = ( (Comparable) v1 ).compareTo( v2 ); break; } throw new IllegalArgumentException( "invalid comparison: " + v1.getClass().getName() + " and " + v2.getClass().getName() ); } // else fall through
可以改造为如下来解决:
case NONNUMERIC: if ( ( t1 == NONNUMERIC ) && ( t2 == NONNUMERIC ) ) { if ( ( v1 instanceof Comparable ) && v1.getClass().isAssignableFrom( v2.getClass() ) ) { result = ( (Comparable) v1 ).compareTo( v2 ); break; } result = -1; }
即最后不抛出异常,而是为-1。
提交问题后(https://issues.apache.org/jira/browse/WW-4230),人家觉得没改的必要,那就无所谓了,知道问题即可。
相关推荐
标题中的“ognl.jar(ognl-2.6.11.jar)”指的是OGNL(Object-Graph Navigation Language)...通过这种方式,开发者可以在遇到问题时直接查看OGNL的源代码,更深入地理解其工作原理,有助于提高开发效率和解决问题的能力。
在使用MyBatis-Plus 3.1.1版本时,如果你尝试使用Lambda表达式进行查询操作,可能会遇到一个常见的错误,导致程序无法正常运行。本文将深入探讨这个问题,并提供解决方案。 首先,让我们分析错误信息。错误日志显示...
在使用Struts2时,开发者通常会遇到如何配置Action、如何创建拦截器、如何实现类型转换、如何处理异常、以及如何使用OGNL表达式等问题。这些问题的答案都可以在这两个API文档中找到。因此,无论你是初学者还是有经验...
5.3.2 使用OGNL表达式从表单字段名映射到属性 90 5.4 自定义类型转换 101 5.4.1 实现类型转换器 102 5.4.2 在String和Circle之间转换 102 5.4.3 配置框架使用自定义转换器 103 5.5 小结 106 第三部分 构建视图——...
6. **OGNL表达式语言**:Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表示层表达式语言,用于数据绑定和表达式求值。 7. **异常处理**:通过全局异常映射,Struts2可以统一处理应用中的异常,...
例如,它可能会介绍如何配置Struts2,创建第一个Action,理解并利用拦截器,以及如何使用OGNL来操作和展示数据。书中还会涵盖Struts2与其他技术的集成,如Spring、Hibernate等,以及最佳实践和性能优化技巧。 另外...
4. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为表达式语言,用于在Action和视图之间传递数据。OGNL允许直接访问对象属性,甚至支持动态表达式和方法调用。 5. **插件体系**:Struts2有一个...
通过分析Struts2的源码,开发者可以更好地理解其内部工作机制,解决实际开发中遇到的问题,或者创建自定义的Action、拦截器和结果类型,以满足特定的项目需求。此外,了解源码也有助于学习软件设计模式和最佳实践,...
6. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为表达式语言,允许在Action和视图之间方便地绑定和获取对象属性。 7. **Struts2的配置机制**:包括XML配置和注解配置两种方式,使得开发者...
- 错误修复:解决了用户在使用旧版本时遇到的问题。 在下载并使用Struts2-2.5.13的jar包时,开发者需要将其加入到项目的类路径中,同时根据项目需求配置struts2.xml或使用注解进行配置。对于初次使用者,建议阅读...
7. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为表达式语言,用于在Action和视图之间传递数据。它可以方便地访问对象属性,进行动态方法调用等操作。 8. **Plug-in插件机制**:Struts2支持...
在Web开发领域,文档起着至关重要的作用,它可以帮助开发者理解框架的工作原理,提供最佳实践指导,以及解决遇到的问题。本指南将围绕标题所提及的"web开发文档指南",结合提供的标签("spring"、"struts1"、"struts...
5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于在Action和视图之间传递数据。开发者可以通过OGNL方便地访问对象属性,进行条件判断和控制流程。 6. **国际化与本地化*...
4. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于数据绑定和表达式计算。 5. **Plug-in架构**:Struts2的插件架构允许开发者轻松扩展框架功能,如添加新的拦截器、结果...
bug当找不到java进程时,提示不清晰,应该提示用户执行jps命令增加一个 ognl 的在线,可编辑的示例,帮助用户自己调试 ognl表达式当Object输出时,可能会抛出异常,打印 ERROR DATA!!! exception message: null把 ...
同时,文档中还会有各种常见问题的解决方案,这对于解决开发中遇到的实际问题非常有帮助。 总之,深入研究Struts2 API文档,不仅能提升你对MVC架构的理解,还能增强你在实际项目中使用Struts2框架的能力,从而编写...
1. **OGNL (Object-Graph Navigation Language)**:Struts2使用OGNL作为默认的表达式语言,允许在Action类和JSP页面之间轻松地传递数据。OGNL可以方便地访问对象的属性,执行方法,甚至进行复杂的数据运算。 2. **...
同时,查看源代码也有助于定位和解决在实际开发中遇到的问题。 总的来说,这个压缩包为学习和研究Struts2框架提供了一手资源,对于Java Web开发者来说是一份宝贵的参考资料。无论是初学者还是有经验的开发者,都能...
在处理用户输入时,可能会遇到验证错误,例如无效的数据或必填字段缺失。Struts2和Spring MVC都提供了内置的验证机制,允许我们在Action类或Model对象上定义验证规则。如果验证失败,系统会生成错误信息,并将其绑定...