[
https://issues.apache.org/jira/browse/WW-4230?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13799932#comment-13799932
]
Lukasz Lenart commented on WW-4230:
-----------------------------------
So what's the problem? Just implement Comparable interface or even better don't
use such logic inside JSP which is bad and erroneous. OGNL is an expression
language and it has some limitation, don't expect exactly the same behaviour as
in Java language - you can always use Java directly.
> ognl use in expression bug
> ----------------------------
>
> Key: WW-4230
> URL: https://issues.apache.org/jira/browse/WW-4230
> Project: Struts 2
> Issue Type: Bug
> Components: Other
> Reporter: zhangkaitao
>
> example
> {code}
> 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;
> }
>
>
> }
> {code}
> {code}
> <%@page import="java.util.ArrayList"%>
> <%@page import="java.util.List"%>
> <%@ page language="java" contentType="text/html; charset=UTF-8"
> pageEncoding="UTF-8"%>
> <%@ page import="cn.A"%>
> <%@taglib prefix="s" uri="/struts-tags" %>
> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
> "http://www.w3.org/TR/html4/loose.dtd">
> <html>
> <head>
> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
> <title>Insert title here</title>
> </head>
> <body>
> <%
> 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="#list.contains(#a)"/><br/>
> </s:iterator>
> </body>
> </html>
> {code}
> exptect result:
> true
> true
> but was :
> true
> only one!!!
> on config struts.el.throwExceptionOnFailure=true , result is :
> invalid comparison: cn.A and cn.A - Class: ognl.OgnlOps
> File: OgnlOps.java
> Method: compareWithConversion
> compareWithConversion :
> {code}
> case NONNUMERIC:
> if ( ( t1 == NONNUMERIC ) && ( t2 == NONNUMERIC ) )
> {
> if (!(v1 instanceof Comparable)) {
> result = -1;
> break;
> }
> 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
> {code}
> add code :
> {code}
> if (!(v1 instanceof Comparable)) {
> result = -1;
> break;
> }
> {code}
> if class not implement Comparable interface , return -1(false)。
--
This message was sent by Atlassian JIRA
(v6.1#6144)