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

时间:2011-06-23 21:06:26

标签: java spring classloader tomcat7 proxy-classes

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

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

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

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

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

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

无论我做什么,这个类在某种程度上都没有正确包装或者没有被类加载器正确加载。

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

提前致谢!

此致 罗伯特

5 个答案:

答案 0 :(得分:2)

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

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

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

你需要在你的课堂上使用CGLIB 希望这有助于某人。 :)

答案 1 :(得分:2)

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

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

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

<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"/>

它对aop-proxy代码的 ged rid(删除)也很好:

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

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

希望这会有所帮助:)

答案 2 :(得分:1)

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

有关如何配置此环境的详细信息,请参阅spring文档,例如: chapter 7.8.4.6 Environment-specific configuration。虽然这涵盖了AOP的加载时间挥发主题,但它与需要加载时间编织的其他弹簧部件的配置相同。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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