?

Log in

Java урок дня 20-02-2013 - Сегодня - лучший день в моей жизни [entries|archive|friends|userinfo]
coderoid

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Java урок дня 20-02-2013 [Feb. 20th, 2013|05:19 pm]
coderoid
[Tags|, , , , , , , , ]

Мигрирование пакета с AspectJ SpringAOP на Load-Time Weaving занимает несколько шагов. Один из них такой:

Было:

<bean id="myAdvice" class="my.advice.MyAdvice">
   <constructor-arg value="2" />
</bean>

Стало (баг):

<bean id="myAdvice" class="my.advice.MyAdvice" factory-method="aspectOf">
   <constructor-arg value="2" />
</bean>

При этом выдается ошибка: No matching factory method found: factory method 'aspectOf()'.

Проблема - использование factory-method автоматом означает, что constructor-arg, который раньше был аргументом конструктора, теперь будет передаваться как параметр метода aspectOf и сделает его параметризованым. А фабрика ищет aspectOf() без параметров и обламывается.

Как всегда, банальный копипаст - а кучу часов потерял на вылавливание ошибки.

Правильно (так как параметризованный конструктор использовать нельзя, инициализируем свойство напрямую):

<bean id="myAdvice" class="my.advice.MyAdvice" factory-method="aspectOf">
   <property name="someAdviceProperty" value="2">
</bean>

Программисты, если вы пишете код, который что-то ищет и не находит, то пишите, пожалуйста, что вы нашли. В этом случае можно было бы добавить "but found aspectOf(int)", или "please check that you do not pass any parameters to aspectOf".

Если проверка числа на диапазон, не пишите "invalid number", а что-то вроде "expected number between 10 and 20 and got: <actual number>". То же самое с enum - "invalid enum value <actual value>, expected it to be one of [ONE, TWO, THREE]."

LinkReply