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,它应该工作。