Ошибка при внедрении Spring-бина в JSF ManagedBean - PullRequest
2 голосов
/ 19 октября 2011

У меня есть 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)

У меня есть ELresolver в face-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>

Кажется, что он может найти класс, но этот класс другого типа ($ Proxy166?, Не знаю, откуда это).

PS: Удаление ELResolver, похоже, помогает;Я думал, что явное предоставление управляемого компонента в файле Face-config.xml переопределит ELResolver.Есть ли способ их обоих сосуществовать?Точно так же, если я предоставляю и аннотацию, и конфигурацию XML для bean-компонента, какой из них предпочтителен, или есть ли способ объединить их, я предоставлю некоторые свойства в аннотации, некоторые в XML?

PPS: после добавленияинтерфейсы и меняя текущие классы для их реализации, я получаю следующую ошибку:

Ошибка при развертывании: Исключительная ситуация при загрузке приложения: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'authDao', определенным в ресурсе ServletContext [/WEB-INF/applicationContext.xml]: сбой инициализации бина;вложенное исключение - org.springframework.beans.ConversionNotSupportedException: не удалось преобразовать значение свойства типа '$ Proxy157, реализующее persistence.UserDao, org.springframework.aop.SpringProxy, org.springframework.aop.framework.Advised' в обязательный тип '.UserDaoImpl 'для свойства' userDao ';вложенным исключением является java.lang.IllegalStateException: невозможно преобразовать значение типа [$ Proxy157, реализующее persistence.UserDao, org.springframework.aop.SpringProxy, org.springframework.aop.framework.Advised], в требуемый тип [persistence.UserDaoImpl] для свойства'userDao': не найдено подходящих редакторов или стратегии конверсии.Пожалуйста, смотрите server.log для более подробной информации.

1 Ответ

7 голосов
/ 19 октября 2011

Это прокси вашего класса.Вы реализуете интерфейс, поэтому Spring создает прокси вокруг интерфейса, но вы пытаетесь внедрить его по конкретному типу.Вместо этого переключитесь на интерфейс (в управляемом компоненте).

Если вам действительно необходимо по какой-то причине выполнить инъекцию для конкретного класса, вы можете использовать @Scoped(proxyMode=ScopeProxyMode.TARGET_CLASS)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...