将Spring bean注入JSF ManagedBean时出错

时间:2011-10-19 12:09:59

标签: spring jsf java-ee

我有一个JSF ManagedBean,它有一个应该由Spring设置的属性。但是,我收到以下错误:

Caused by: javax.el.ELException: java.lang.IllegalArgumentException: Cannot convert persistence.AuthDao@2f6e6ad9 of type class $Proxy166 to class persistence.AuthDao
at com.sun.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:68)
at com.sun.faces.el.ELUtils.coerce(ELUtils.java:536)
at com.sun.faces.mgbean.BeanBuilder$Expression.evaluate(BeanBuilder.java:592)
at com.sun.faces.mgbean.ManagedBeanBuilder$BakedBeanProperty.set(ManagedBeanBuilder.java:606)
... 57 more
Caused by: java.lang.IllegalArgumentException: Cannot convert persistence.AuthDao@2f6e6ad9 of type class $Proxy166 to class persistence.AuthDao
at com.sun.el.lang.ELSupport.coerceToType(ELSupport.java:397)
at com.sun.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:66)

我在faces-config.xml中有ELresolver。

<managed-bean>
    <managed-bean-name>authController</managed-bean-name>
    <managed-bean-class>controllers.AuthController</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>authDao</property-name>
        <value>#{authDao}</value>
    </managed-property>
</managed-bean>

<application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

似乎它可以找到类,但是类是另一种类型($ Proxy166?,不知道它来自哪里)。

PS:删除ELResolver似乎可以解决问题;我认为在faces-config.xml中明确提供managed-bean会覆盖ELResolver。那么这两种方式有什么共存的呢?类似地,如果我为bean提供注释和XML配置,其中一个是首选的,或者有没有办法合并它们,那么在注释中提供一些属性,有些属于XML吗?

PPS:添加接口并更改当前类以实现它们后,我收到以下错误:

  

部署期间出错:加载应用时出现异常:   java.lang.IllegalStateException:ContainerBase.addChild:start:   org.apache.catalina.LifecycleException:   org.springframework.beans.factory.BeanCreationException:错误   在ServletContext资源中定义名为'authDao'的bean   [/WEB-INF/applicationContext.xml]:bean的初始化失败;   嵌套异常是   org.springframework.beans.ConversionNotSupportedException:失败   转换类型'$ Proxy157实现的属性值   persistence.UserDao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised”   属性'userDao'所需的类型'persistence.UserDaoImpl';   嵌套异常是java.lang.IllegalStateException:无法转换   类型的值[$ Proxy157实现   persistence.UserDao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]   要求属性'userDao'的类型[persistence.UserDaoImpl]:否   找到匹配的编辑器或转换策略。请参阅server.log   了解更多详情。

1 个答案:

答案 0 :(得分:7)

这是你班级的代理人。您正在实现一个接口,因此spring在接口周围创建了一个代理,但您尝试按具体类型注入。切换到界面(在托管bean中)。

如果你真的需要某些理由通过具体课程注入,你可以使用@Scoped(proxyMode=ScopeProxyMode.TARGET_CLASS)