Java / JSF / Tomcat / Spring - Proxy-Object имеет методы, отличные от исходного объекта - PullRequest
10 голосов
/ 24 июня 2011

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

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

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

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

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

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

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

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

Заранее спасибо!

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

Ответы [ 5 ]

2 голосов
/ 19 января 2012

ОК, я узнал, как управлять безопасностью метода с помощью 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>

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

<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.

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

2 голосов
/ 17 января 2012

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

Мое окончательное решение было добавить одну строку в конфигурацию Spring:

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

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

1 голос
/ 01 июля 2011

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

См. Весеннюю документацию для получения дополнительной информации о том, как настроить эту среду, например. глава 7.8.4.6 Конфигурация для конкретной среды . Несмотря на то, что это относится к теме размаха времени загрузки для AOP, такая же конфигурация для других частей пружины, которая требует переплетения времени загрузки.

0 голосов
/ 09 августа 2013

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

0 голосов
/ 26 июля 2011

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

...