Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/JSF/Tomcat/Spring-代理对象的方法与原始对象不同_Java_Spring_Classloader_Tomcat7_Proxy Classes - Fatal编程技术网

Java/JSF/Tomcat/Spring-代理对象的方法与原始对象不同

Java/JSF/Tomcat/Spring-代理对象的方法与原始对象不同,java,spring,classloader,tomcat7,proxy-classes,Java,Spring,Classloader,Tomcat7,Proxy Classes,今天,我遇到了这个问题,这让我非常恼火,因为几乎所有的代码都已经工作了(甚至在恢复到旧版本后也停止了工作) 我正在访问Facelets页面上的Springbean。Spring将这些对象包装在代理中,以使用方面和其他一些东西 问题是,我在尝试访问bean的属性时遇到异常。例外情况如下: javax.el.PropertyNotFoundException: /customers.xhtml @23,27 value="#{customerBean.customer}": Property 'cu

今天,我遇到了这个问题,这让我非常恼火,因为几乎所有的代码都已经工作了(甚至在恢复到旧版本后也停止了工作)

我正在访问Facelets页面上的Springbean。Spring将这些对象包装在代理中,以使用方面和其他一些东西

问题是,我在尝试访问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的类名
  • 更改springbean的id
  • 更改bean的SerialVersionId
无论我做什么,类都没有被正确包装或者没有被类装入器正确装入

有人知道什么会导致这样的问题吗?我不知道还可以尝试什么,所以非常感谢您的建议

提前谢谢

问候,,
Robert

如果加载时编织配置不正确,通常会发生这些错误。确保您不仅配置了加载时编织器,而且还加载了适当的java代理,或者应用服务器为您这样做


有关如何配置此环境的更多信息,请参阅spring文档,例如。虽然这涵盖了AOP的加载时间波动主题,但对于需要加载时间编织的spring的其他部分,它的配置是相同的。

尝试删除customerBean中具有一个域的域。

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

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

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

Jou需要类路径上的CGLIB。

希望这对某人有帮助。:)

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

您需要至少使用Spring security 3.0.5,您需要在Spring-security.xml中使用正确的模式,至少:

您需要添加spring安全特性作为依赖项:

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

org.springframework.security
春季安全方面
3.0.5.1发布
然后,您可以向全局方法安全标记添加新属性“mode”:

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

我认为您还必须在标准Spring-configuration.xml中添加支持AspectJ编织的标记:

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

同时,删除aop代理标记也很好:

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

另外,最好使用SpringSecurity3.1.0,但至少也要使用Spring3.0.7


希望这有帮助:)

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

您说“Spring将这些对象包装在代理中”。您是如何配置它的?什么机制?什么配置?没有配置,因为spring默认会这样做。这是使自动连接属性而不使用setter方法成为可能所必需的。某处,某处,你让它这么做的。通过现场注入的自动布线是通过反射而不是代理完成的。谢谢您的回答。我没有提到的是,我正在使用Spring安全性,它可能是代理的来源,因为它使用方面来实现方法安全性。spring文档说明spring中的代理是JDK动态代理或CGLIB代理。我还尝试输出bean本身(h:outputText with value=“#{customerBean})。这将使用正确的类名和对象标识符打印正确的Object-toString()方法。因此,访问bean本身是可行的,但是像getCustomer()这样的方法方法没有。好吧,现在我做了更多的研究,并试图思考我在哪里间接配置了代理。我使用带有@Transactional注释的DAO对象。根据文档,事务处理是通过代理完成的。我在bean的一个方法(即customerBean)上另外有@Transactional注释。我删除了这个,现在它可以工作了。但我想还是有问题,因为代理对象应该与包装对象具有相同的公共接口。我使用的是Spring 4.3.4、Java 8和Weblogic 12.2.1.0,这个答案帮助我解决了
javax.el.PropertyNotFoundException
。谢谢@ondrej bozek