Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с equals и '==' в SPEL / 25 сообщений из 33, страница 1 из 2
19.10.2013, 12:08:03
    #38433812
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
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
19.10.2013, 12:32:02
    #38433824
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
...
Рейтинг: 0 / 0
19.10.2013, 12:33:51
    #38433825
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Usman, так я там тоже самое спрашиваю)
...
Рейтинг: 0 / 0
19.10.2013, 12:41:17
    #38433829
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
...
Рейтинг: 0 / 0
19.10.2013, 12:55:34
    #38433838
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Usman, и что это объясняет?)
...
Рейтинг: 0 / 0
19.10.2013, 13:34:19
    #38433858
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
rdmUsman, и что это объясняет?)
Код: java
1.
(oneObj==twoObj)? true : false);

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

Будет false , т.к. здесь сравниваются ссылки , которые "указывают" на разные объекты.
Мой вопрос из первого сообщения звучит как "Почему для аргументов Long вызывается .equals, а для объектов классаTestObject используется сравнение через '==' ?"
...
Рейтинг: 0 / 0
19.10.2013, 13:49:12
    #38433882
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Long one и Long two тоже разные объект (one != two), но почему то метод @PreAuthorize(" #one == #two ") не бросает AccessDeniedException, т.е. Long он сравнивает через equals().
...
Рейтинг: 0 / 0
19.10.2013, 13:57:38
    #38433888
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
rdmLong one и Long two тоже разные объект (one != two), но почему то метод @PreAuthorize(" #one == #two ") не бросает AccessDeniedException, т.е. Long он сравнивает через equals().В Long'е реализован интерфейс Comparable . Может из-за этого?
...
Рейтинг: 0 / 0
19.10.2013, 14:03:05
    #38433895
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Usman, не знаю) Вы утверждаете или предполагаете?)
...
Рейтинг: 0 / 0
19.10.2013, 14:05:59
    #38433898
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
rdmUsman, не знаю) Вы утверждаете или предполагаете?)Утверждаю. Попробуйте реализовать этот самый интефейс в своем TestObject'е.
...
Рейтинг: 0 / 0
19.10.2013, 14:19:21
    #38433909
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
UsmanrdmUsman, не знаю) Вы утверждаете или предполагаете?)Утверждаю. Попробуйте реализовать этот самый интефейс в своем TestObject'е.
Реализовал. Ничего не изменилось(
...
Рейтинг: 0 / 0
19.10.2013, 17:06:53
    #38434002
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
rdmUsmanпропущено...
Утверждаю. Попробуйте реализовать этот самый интефейс в своем TestObject'е.
Реализовал. Ничего не изменилось(Все дело в Unboxing .
...
Рейтинг: 0 / 0
19.10.2013, 17:32:40
    #38434011
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
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
19.10.2013, 17:36:02
    #38434014
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
WGAВсе дело в Unboxing .+100
...
Рейтинг: 0 / 0
19.10.2013, 17:47:35
    #38434016
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Usman, так причем здесь getLong()? Я просто тогда буду сравнивать два объекта Long. Как видно из примера, Long SPEL сравнивает через equals(). Я же хочу понять, что SPEL одни объекты(как Long) сравнивает через equals, а другие по ссылке. Вариант с Unboxing не кажется мне правильным, так как я прямо в сигнатуре метода пишу Long, и с чего вдруг при записи Long a == Long b, будет происходить Unboxing? В первом сообщении я прямо сравниваю два Long'а и никакого Unboxing не происходит.
...
Рейтинг: 0 / 0
19.10.2013, 17:55:11
    #38434020
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
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
19.10.2013, 18:01:45
    #38434028
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Usman, как-то все запутано выходит. Вот например сравниваются два Long'а, причем можно точно сказать что не по ссылке, а метод equals() не вызывается (судя по дебагу). Хочется получить что-то вроде таблицы как и что SPEL сравнивает.
...
Рейтинг: 0 / 0
19.10.2013, 18:33:20
    #38434047
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
rdmUsman, как-то все запутано выходит.Вобщем, все сводится к тому, чтобы преобразовать значение объекта к примитивному типу:
для численных - Number, для остальных - все вроде бы предсказуемо. Ну, или на крайняк,
вводите спец. метод типа getLong() %)rdmХочется получить что-то вроде таблицы как и что SPEL сравнивает.Такого нигде не видел.
...
Рейтинг: 0 / 0
19.10.2013, 18:42:36
    #38434049
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Usman, т.е. другими словами если объект реализует интерфейс Number SPEL преобразует к примитиву и их сравнивает, иначе сравнение по ссылке?
...
Рейтинг: 0 / 0
19.10.2013, 18:59:43
    #38434054
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
rdmиначе сравнение по ссылке?Нет. Тогда произойдет java.lang.ClassCastException: org.project.TestObject cannot be cast to java.lang.Long.
На счет сравнения по ссылке... я имел ввиду про разницу между оператором == и методом equals (не для примитивов).
Но опять же, если взять строки (String) в EL сравнение нормально происходит без метода equals .
...
Рейтинг: 0 / 0
19.10.2013, 19:02:23
    #38434059
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Это не оно?

Код: 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
19.10.2013, 19:07:00
    #38434064
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Alexander A. SakЭто не оно?Оно самое!
...
Рейтинг: 0 / 0
19.10.2013, 19:09:34
    #38434068
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Alexander A. Sak, похоже на правду. Хм, т.е. метод equals вообще не при делах оказывается?
Мне кажется спорное решение.
...
Рейтинг: 0 / 0
19.10.2013, 19:12:06
    #38434070
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с equals и '==' в SPEL
Интересно почему все таки, они не используют сравнение с equals, в чем смысл? Т.е. в последней строчке вместо left==right сделать left.equals(right). Странно все это.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с equals и '==' в SPEL / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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