Java/JSF/Tomcat/Spring - Прокси-объект имеет разные методы, чем исходный объект

Сегодня я столкнулся с этой проблемой, которая действительно меня беспокоит, поскольку почти код уже работал (и перестал работать даже после возврата к старой версии).

Я получаю доступ к Spring - Bean на странице Facelets. Spring обертывает эти объекты в Proxies, чтобы использовать аспекты и некоторые другие вещи.

Проблема заключается в том, что я получаю исключение при попытке получить доступ к свойству bean. Исключение составляет примерно следующее:

javax.el.PropertyNotFoundException: /customers.xhtml @23,27 value="#{customerBean.customer}": Property 'customer' not found on type $Proxy88

Я точно знаю (!!), что существуют соответствующие методы getter/setter. Вещи, которые я пробовал до сих пор:

  • Разверните приложение для другой установки tomcat
  • Очистить все tomcat-кэши, каталог webapp
  • Очистить проект eclipse
  • Проверить соответствующие методы с помощью javap (и методов/свойств там)
  • Измените область действия bean
  • Измените имя класса bean
  • Измените Spring bean -id
  • Измените serialVersionUID bean

Независимо от того, что я делаю, класс каким-то образом неправильно загружен или неправильно загружен загрузчиком классов.

Кто-нибудь знает, что может вызвать такую ​​проблему? Я не знаю, что попробовать дополнительно, поэтому любой совет очень ценится!

Спасибо заранее!

С уважением, Роберт

Ответ 1

Эти ошибки обычно возникают, если неправильное конфигурирование времени загрузки. Убедитесь, что вы не просто настроили загрузчик времени загрузки, но также загрузите соответствующий Java-агент или сервер приложений сделает это за вас.

Дополнительную информацию о настройке этой среды см. в документации spring, например. глава 7.8.4.6 Конфигурация, зависящая от среды. Хотя это охватывает тему размахивания времени загрузки для АОП, она имеет ту же конфигурацию для других частей spring, которые требуют загрузки времени загрузки.

Ответ 2

Я также использую Tomcat 7, JSF 2, Spring 3, Spring Security 3. У меня были такие же проблемы. Изменение конфигурации ткачества не помогло.

Моим окончательным решением было добавить одну строку в Spring config:

<aop:aspectj-autoproxy proxy-target-class="true"/>  

Мне нужен CGLIB для вашего пути к классам.
Надеюсь, это поможет кому-то.:)

Ответ 3

ОК, я узнал, как управлять методом безопасности с использованием плетения AspectJ.

Вам нужно использовать как минимум Spring -security 3.0.5, вам нужно использовать правильные схемы в Spring -security.xml, по крайней мере:
http://www.springframework.org/schema/security/spring-security-3.0.5.xsd

Вам нужно добавить Spring -security-аспекты как зависимость:

<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-aspects</artifactId>             
   <version>3.0.5.RELEASE</version>
</dependency>

чем вы можете добавить новый "режим" атрибута в свой тег безопасности глобального метода:

<global-method-security pre-post-annotations="enabled" mode="aspectj"/>

Я думаю, вам также нужно добавить в свой стандартный тег Spring -configuration.xml, который позволяет плетение AspectJ:

<context:load-time-weaver aspectj-weaving="on"/>

И его также полезно ged rid (удалить) тега aop-proxy:

<aop:aspectj-autoproxy proxy-target-class="true"/>

Также лучше использовать Spring -security 3.1.0, но вам также нужно использовать как минимум Spring 3.0.7.

Надеюсь, что это поможет:)

Ответ 4

Попробуйте удалить домены customerBean, у которых есть поля oneToMany.

Ответ 5

Я думаю, что ваш bean реализован Serializable. Я столкнулся с этим сегодня, Serializable делает что-то странное для прокси, ни один из моих методов не был доступен. Избавьтесь от Serializable, и он должен работать.