Java / JSF / Tomcat / Spring – Proxy-Object与原始对象有不同的方法

今天我遇到了这个问题,这真的让我感到困扰,因为几乎代码已经运行了(并且即使在恢复到旧版本之后也停止了工作)。

我正在Facelets-Page上访问一个Spring-Bean。 Spring在Proxies中包装这些对象以使用方面和其他一些东西。

问题是,我在尝试访问bean的属性时遇到exception。 例外是这样的:

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

我肯定知道(!!)有相应的getter / setter方法。 到目前为止我尝试的事情:

  • 将应用程序部署到另一个tomcat安装
  • 清除所有tomcat-caches,webapp目录
  • 清理eclipse项目
  • 使用javap(以及那里的方法/属性)检查相应的方法
  • 更改bean的范围
  • 更改bean的类名
  • 更改spring bean-id
  • 更改bean的serialVersionUID

无论我做什么,类都不正确地被类加载器正确包装或者没有正确加载。

有谁知道什么可能导致这样的问题? 我不知道该怎么做,所以任何建议都非常感谢!

提前致谢!

问候,罗伯特

如果未正确配置加载时间编织,则通常会发生这些错误。 确保您不仅要配置加载时织入器,还要加载适当的java代理,或者应用程序服务器为您执行此操作。

有关如何配置此环境的更多信息,请参阅spring文档,例如章节7.8.4.6特定于环境的配置 。 虽然这涵盖了AOP的加载时间挥发主题,但它与需要加载时间编织的弹簧的其他部分的配置相同。

我也使用Tomcat 7,JSF 2,Spring 3,Spring Security 3.我遇到了同样的问题。 改变编织配置没有帮助。

我的最终解决方案是在spring配置中添加一行:

  

你需要在你的类路径上使用CGLIB。
希望这有助于某人。 🙂

好的,我发现了如何使用AspectJ编织来管理方法安全性。

您至少需要使用Spring-security 3.0.5,至少需要在spring-security.xml中使用正确的模式:
http://www.springframework.org/schema/security/spring-security-3.0.5.xsd

您需要添加spring-security-aspects作为依赖项:

  org.springframework.security spring-security-aspects 3.0.5.RELEASE  

您可以在全局方法安全标记中添加新属性“mode”:

  

我认为你还必须添加标准的Spring-configuration.xml,这个标签可以实现AspectJ编织:

  

它也很好地删除(删除) aop-proxy标记:

  

另外最好使用Spring-security 3.1.0,但是你必须至少使用Spring 3.0.7。

希望这可以帮助 :)

尝试删除拥有oneToMany字段的customerBean域。

我认为你的bean实现了Serializable 。 今天我遇到了这个问题,Serializable对代理做了一些奇怪的事情,我的方法都不可访问。 摆脱Serializable,它应该工作。