powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с equals и '==' в SPEL
33 сообщений из 33, показаны все 2 страниц
Проблема с equals и '==' в SPEL
    #38433812
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spring Expression Language (SpEL) сравнивает объекты используя метод equals или '=='?

Чем вызваны такие результаты(используется Spring Security method access)?
Почему для аргументов Long вызывается .equals, а для объектов классаTestObject используется сравнение через '==' ?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
//TestObject 

      public class TestObject {

      private static final Logger log = LoggerFactory.getLogger(TestObject.class);

      private Long id;

      public TestObject(Long id) {
           this.id = id;
      }

       @Override
       public int hashCode() {
           int hash = 7;
           hash = 71 * hash + Objects.hashCode(this.id);
           return hash;
       }

       @Override
       public boolean equals(Object obj) {

       log.info("equals");

       if (obj == null) {
          return false;
       }

       if (getClass() != obj.getClass()) {
         return false;
       }
       final TestObject other = (TestObject) obj;
       if (!Objects.equals(this.id, other.id)) {
         return false;
       }
      return true;
  }               
}

//TestService

@PreAuthorize(" #one == #two ")
public String testEqualsInAnnotation(Long one, Long two) {        
    //...
}

@Override
@PreAuthorize(" #one == #two ")
public String testEqualsInAnnotation(TestObject one, TestObject two) {
    //...
}

//Test

    log.info("for Long");
    Long one = new Long(500);
    Long two = new Long(500);        

    log.info("one == two: {}", (one==two)? true : false); // print false
    log.info("one equals two: {}", (one.equals(two))? true : false); // print true

    testService.testEqualsInAnnotation(one, two); //OK

    log.info("for TestObject");

    TestObject oneObj = new TestObject(new Long(500));
    TestObject twoObj = new TestObject(new Long(500));              

    log.info("oneObj == twoObj: {}", (oneObj==twoObj)? true : false); // print false
    log.info("oneObj equals twoObj: {}", (oneObj.equals(twoObj))? true : false); // print true

    testService.testEqualsInAnnotation(oneObj, twoObj); // AccessDeniedException: Access is denied
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433824
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433825
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, так я там тоже самое спрашиваю)
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433829
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433838
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, и что это объясняет?)
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433858
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmUsman, и что это объясняет?)
Код: java
1.
(oneObj==twoObj)? true : false);

Будет false , т.к. здесь сравниваются ссылки , которые "указывают" на разные объекты.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433881
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanrdmUsman, и что это объясняет?)
Код: java
1.
(oneObj==twoObj)? true : false);

Будет false , т.к. здесь сравниваются ссылки , которые "указывают" на разные объекты.
Мой вопрос из первого сообщения звучит как "Почему для аргументов Long вызывается .equals, а для объектов классаTestObject используется сравнение через '==' ?"
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433882
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Long one и Long two тоже разные объект (one != two), но почему то метод @PreAuthorize(" #one == #two ") не бросает AccessDeniedException, т.е. Long он сравнивает через equals().
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433888
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmLong one и Long two тоже разные объект (one != two), но почему то метод @PreAuthorize(" #one == #two ") не бросает AccessDeniedException, т.е. Long он сравнивает через equals().В Long'е реализован интерфейс Comparable . Может из-за этого?
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433895
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, не знаю) Вы утверждаете или предполагаете?)
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433898
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmUsman, не знаю) Вы утверждаете или предполагаете?)Утверждаю. Попробуйте реализовать этот самый интефейс в своем TestObject'е.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38433909
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanrdmUsman, не знаю) Вы утверждаете или предполагаете?)Утверждаю. Попробуйте реализовать этот самый интефейс в своем TestObject'е.
Реализовал. Ничего не изменилось(
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434002
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
rdmUsmanпропущено...
Утверждаю. Попробуйте реализовать этот самый интефейс в своем TestObject'е.
Реализовал. Ничего не изменилось(Все дело в Unboxing .
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434011
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmРеализовал. Ничего не изменилось(
Для примера добавьте след. метод в TestObject:
Код: java
1.
2.
3.
public Long getLong() {
  return id;
}

А Spring EL будет выглядеть так:
Код: java
1.
2.
parser.parseExpression("#a.getLong() == #b.getLong()").getValue(context, Boolean.class);
parser.parseExpression("#a.getLong() > #b.getLong()").getValue(context, Boolean.class);

Работает!
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434014
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WGAВсе дело в Unboxing .+100
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434016
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, так причем здесь getLong()? Я просто тогда буду сравнивать два объекта Long. Как видно из примера, Long SPEL сравнивает через equals(). Я же хочу понять, что SPEL одни объекты(как Long) сравнивает через equals, а другие по ссылке. Вариант с Unboxing не кажется мне правильным, так как я прямо в сигнатуре метода пишу Long, и с чего вдруг при записи Long a == Long b, будет происходить Unboxing? В первом сообщении я прямо сравниваю два Long'а и никакого Unboxing не происходит.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434020
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmВ первом сообщении я прямо сравниваю два Long'а и никакого Unboxing не происходит.Продолжил эксперименты... Сделал открытие для себя... Оказывается дело в интерфейсе Number...
TestObject
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
@SuppressWarnings("serial")
class TestObject extends Number {

	private Long id;

	public TestObject(Long id) {
		this.id = id;
	}
	
	@Override
	public String toString() {
		return id.toString();
	}

	@Override
	public int intValue() {
		return id.intValue();
	}

	@Override
	public long longValue() {
		return id.longValue();
	}

	@Override
	public float floatValue() {
		return id.floatValue();
	}

	@Override
	public double doubleValue() {
		return id.doubleValue();
	}
}

Ну, и использование в EL:
Код: java
1.
2.
parser.parseExpression("#a == #b").getValue(context, Boolean.class);
parser.parseExpression("#a > #b").getValue(context, Boolean.class);
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434028
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, как-то все запутано выходит. Вот например сравниваются два Long'а, причем можно точно сказать что не по ссылке, а метод equals() не вызывается (судя по дебагу). Хочется получить что-то вроде таблицы как и что SPEL сравнивает.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434047
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmUsman, как-то все запутано выходит.Вобщем, все сводится к тому, чтобы преобразовать значение объекта к примитивному типу:
для численных - Number, для остальных - все вроде бы предсказуемо. Ну, или на крайняк,
вводите спец. метод типа getLong() %)rdmХочется получить что-то вроде таблицы как и что SPEL сравнивает.Такого нигде не видел.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434049
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, т.е. другими словами если объект реализует интерфейс Number SPEL преобразует к примитиву и их сравнивает, иначе сравнение по ссылке?
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434054
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmиначе сравнение по ссылке?Нет. Тогда произойдет java.lang.ClassCastException: org.project.TestObject cannot be cast to java.lang.Long.
На счет сравнения по ссылке... я имел ввиду про разницу между оператором == и методом equals (не для примитивов).
Но опять же, если взять строки (String) в EL сравнение нормально происходит без метода equals .
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434059
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не оно?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
package org.springframework.expression.spel.ast;

import org.springframework.expression.EvaluationException;
import org.springframework.expression.spel.ExpressionState;
import org.springframework.expression.spel.support.BooleanTypedValue;

/**
 * Implements equality operator.
 *
 * @author Andy Clement
 * @since 3.0
 */
public class OpEQ extends Operator {

	public OpEQ(int pos, SpelNodeImpl... operands) {
		super("==", pos, operands);
	}

	@Override
	public BooleanTypedValue getValueInternal(ExpressionState state) throws EvaluationException {
		Object left = getLeftOperand().getValueInternal(state).getValue();
		Object right = getRightOperand().getValueInternal(state).getValue();
		if (left instanceof Number && right instanceof Number) {
			Number op1 = (Number) left;
			Number op2 = (Number) right;
			if (op1 instanceof Double || op2 instanceof Double) {
				return BooleanTypedValue.forValue(op1.doubleValue() == op2.doubleValue());
			} else if (op1 instanceof Long || op2 instanceof Long) {
				return BooleanTypedValue.forValue(op1.longValue() == op2.longValue());
			} else {
				return BooleanTypedValue.forValue(op1.intValue() == op2.intValue());
			}
		}
		if (left!=null && (left instanceof Comparable)) {
			return BooleanTypedValue.forValue(state.getTypeComparator().compare(left, right) == 0);
		} else {
			return BooleanTypedValue.forValue(left==right);
		}
	}

}
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434064
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakЭто не оно?Оно самое!
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434068
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. Sak, похоже на правду. Хм, т.е. метод equals вообще не при делах оказывается?
Мне кажется спорное решение.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434070
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно почему все таки, они не используют сравнение с equals, в чем смысл? Т.е. в последней строчке вместо left==right сделать left.equals(right). Странно все это.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434074
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanAlexander A. SakЭто не оно?Оно самое!
Странно почему у меня интерфейс Comparable не сработал...
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434081
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я взял из исходников Spring 3.1.0. Может, в разных версиях по-разному.

Насчет почему не сделали в конце "==", подозреваю, из-за наличия оператора "equals". Сейчас EL поведением более похож на Java.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434085
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять же, смотрю EL в JSP 2.1. Там действительно в крайнем случае делают A.equals(B). С этой стороны Spring вроде как в неправильную сторону выделился.

Нет в жизни счастья, в общем.
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434087
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmUsmanпропущено...
Утверждаю. Попробуйте реализовать этот самый интефейс в своем TestObject'е.
Реализовал. Ничего не изменилось(
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class TestObject implements Comparable<TestObject> {

	private Long id;

	public TestObject(Long id) {
		this.id = id;
	}
	
	public Long getId() {
		return id;
	}

	@Override
	public int compareTo(TestObject o) {
		return (int)(id - o.getId());
	}
}

Так тоже работает, оказывается :)
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434088
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmСтранно почему у меня интерфейс Comparable не сработал... 15002751
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434091
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanrdmСтранно почему у меня интерфейс Comparable не сработал... 15002751
Я в Comparable ошибся, стал Long'и сравнивать опять)
Код: java
1.
2.
3.
4.
if(this.id == other.id) {
            
            return 0;
//...



То что SPEL вообще не использует equals() это разве не ошибка? Или они тем самым говорят, хотите equals так и пишите
Код: java
1.
" #object.equals(#otherObject) "
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434092
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakЯ взял из исходников Spring 3.1.0. Может, в разных версиях по-разному.

Насчет почему не сделали в конце "==", подозреваю, из-за наличия оператора "equals". Сейчас EL поведением более похож на Java.
Они как раз в конце сделали "==", а не equals()
...
Рейтинг: 0 / 0
Проблема с equals и '==' в SPEL
    #38434198
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну да. Думал про equals(), написал про "==".
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с equals и '==' в SPEL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]