2
votes

I have a JSF ManagedBean which has a property that should be set by Spring. However, I get the following error:

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)

I have the ELresolver in faces-config.xml.

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

It seems that it can find the class, but the class is of another type ($Proxy166?, not sure where that comes from).

PS: Removing the ELResolver seems to do the trick; I thought explicitly providing managed-bean in faces-config.xml would override ELResolver. Is there any way of both of these to coexist, then? Similarly, if I provide both annotation and XML configuration for a bean, which one of these is preferred, or is there a way to merge them, provide some properties in annotation, some in XML?

PPS: After adding interfaces and changing my current classes to implement them, I get the following error:

Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authDao' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy157 implementing persistence.UserDao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'persistence.UserDaoImpl' for property 'userDao'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy157 implementing persistence.UserDao,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [persistence.UserDaoImpl] for property 'userDao': no matching editors or conversion strategy found. Please see server.log for more details.

1

1 Answers

7
votes

This is a proxy of your class. You are implementing an interface, so spring creates a proxy around the interface, but you are trying to inject by concrete type. Switch to the interface instead (in the managed bean).

If you really need for some reason to inject by concrete class, you can use @Scoped(proxyMode=ScopeProxyMode.TARGET_CLASS)