Spring不能创建bean [英] Spring can't create beans

查看:102
本文介绍了Spring不能创建bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我在使用spring mvc和hibernate开发Web应用程序时遇到异常,问题在于Spring不知道我的bean
Controller

  @Autowired 
public PersonneMetierImpl personneMetier;

@RequestMapping(value =/ test,method = RequestMethod.GET)
public String test(Locale locale,Model model){
personneMetier.ajouterPersonne(new Personne azrou,zakaria.bariki@gmail.com,bariki,zakaria,0641057217));
返回test;
}

DAO类别

  @Repository 
public class PersonneDaoImpl implements IPersonneDao {
$ b $ @Autowired
private SessionFactory sessionFactory;

@Override
public void ajouterPersonne(Personne personne){
if(sessionFactory == null)
System.out.println(aaaa);
尝试{
sessionFactory.getCurrentSession()。save(personne);

} catch(Exception e){
e.printStackTrace();


$ / code>

服务等级
服务
public class PersonneMetierImpl implements IPersonneMetier {
@Autowired
private PersonneDaoImpl personneDao;

  @Override 
@Transactional
public void ajouterPersonne(Personne personne){
personneDao.ajouterPersonne(personne);

Servlet-Context文件

 < beans:bean id =datasource
class =org.springframework.jdbc.datasource.DriverManagerDataSource>
< beans:property name =driverClassNamevalue =com.mysql.jdbc.Driver/>
< beans:property name =url
value =jdbc:mysql:// localhost:3306 / gestion_bp/>
< beans:property name =usernamevalue =root/>
< beans:property name =passwordvalue =/>
< / beans:bean>
< beans:bean id =sessionFactory
class =org.springframework.orm.hibernate4.LocalSessionFactoryBean>
< beans:property name =dataSourceref =datasource/>
< beans:property name =hibernateProperties>
< beans:道具>
< beans:prop key =hibernate.show_sql> true< / beans:prop>
< beans:prop key =hibernate.hbm2ddl.auto> update< / beans:prop>
< beans:prop key =hibernate.dialect> org.hibernate.dialect.MySQLDialect
< / beans:prop>
< / beans:道具>
< / beans:property>
< / beans:bean>


< context:component-scan base-package =com.sqli.bap/>
< bean:bean id =transactionManager
class =org.springframework.orm.hibernate4.HibernateTransactionManager>
< beans:property name =sessionFactoryref =sessionFactory/>
< / beans:bean>
< tx:注解驱动的事务管理器=transactionManager/>

< beans:bean id =personneDaoclass =com.sqli.bap.daoImpl.PersonneDaoImpl/>
< beans:bean id =personneMetierclass =com.sqli.bap.metierImpl.PersonneMetierImpl/>

异常

  ERROR:org.springframework.web.servlet.DispatcherServlet  - 上下文初始化失败
org.springframework.beans.factory.BeanCreationException:创建名为'homeController'的bean时出错:注入自动装配依赖失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装入字段:public com.sqli.bap.metierImpl.PersonneMetierImpl com.sqli.bap.HomeController.personneMetier;嵌套异常是java.lang.IllegalArgumentException:无法将com.sqli.bap.metierImpl.PersonneMetierImpl字段com.sqli.bap.HomeController.personneMetier设置为com.sun.proxy。$ Proxy16
at org.springframework.beans .factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122)
at org.springframework.beans .factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans .factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingl eton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory。 getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(
在org.springframework.configureAndRefreshWebApplicationContext(FrameworkServlet.java:
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicat在org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet。
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
在org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
在org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
在org.apache .catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5253)
at org.apache.catalina.core .StandardContext.startInternal(StandardContext.java:5543)
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
在org.apache.catalina.core.Contain erBase $ StartChild.call(ContainerBase.java:1574)
位于org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1564)
位于java.util.concurrent.FutureTask。运行(未知源)
在java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知源)
在java。 lang.Thread.run(Unknown Source)
引起:org.springframework.beans.factory.BeanCreationException:无法自动装入字段:public com.sqli.bap.metierImpl.PersonneMetierImpl com.sqli.bap.HomeController.personneMetier ;嵌套异常是java.lang.IllegalArgumentException:无法将com.sqli.bap.metierImpl.PersonneMetierImpl字段com.sqli.bap.HomeController.personneMetier设置为com.sun.proxy。$ Proxy16
at org.springframework.beans .factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework .beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
... 29 more
导致:java.lang.IllegalArgumentException:无法设置com.sqli.bap.metierImpl。 PersonneMetierImpl field com.sqli.bap.HomeController.personneMetier to com.sun.proxy。$ proxy16
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgum entException(未知源)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(未知源)$ b $在java.lang.reflect.Field.set(未知源)
在org.springframework.beans。 factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:510)
... 31 more

任何人都可以告诉我,我可以做些什么来解决问题,请
非常感谢您

解决方案

你需要改变你的控制器 - 替换行

  public PersonneMetierImpl personneMetier; 

with

  public IPersonneMetier personneMetier; 

(即使用接口而不是实现)。

在某些情况下(包括你的),Spring并不使用bean( PersonneMetierImpl ),而是将其封装在代理中。在这种情况下,它是一个 JDK动态代理,它不能转换为 PersonneMetierImpl ,但只能转换为 IPersonneMetier (JDK代理是基于接口的)。这就是为什么Spring不能autowire字段 PersonneMetierImpl personneMetier



哦,并且出于同样的原因(和因为这就是接口的原因)你应该改变 PersonneMetierImpl class - 用 private PersonneDaoImpl personneDao > private IPersonneDao personneDao 。


Hello everyone I'm getting an exception while develeping a web application with spring mvc and hibernate, the problem is that spring don't know my beans Controller

@Autowired
public PersonneMetierImpl personneMetier;

@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test(Locale locale, Model model) {
    personneMetier.ajouterPersonne(new Personne("azrou", "zakaria.bariki@gmail.com", "bariki", "zakaria", "0641057217"));
    return "test";
}

DAO classe

@Repository
public class PersonneDaoImpl implements IPersonneDao {

@Autowired
private SessionFactory sessionFactory;

@Override
public void ajouterPersonne(Personne personne) {
    if(sessionFactory == null)
        System.out.println("aaaa");
    try{
        sessionFactory.getCurrentSession().save(personne);

    }catch(Exception e){
        e.printStackTrace();
    }
}

Service class Service public class PersonneMetierImpl implements IPersonneMetier{ @Autowired private PersonneDaoImpl personneDao;

@Override
@Transactional
public void ajouterPersonne(Personne personne) {
    personneDao.ajouterPersonne(personne);  
}

Servlet-Context file

    <beans:bean id="datasource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="url"
        value="jdbc:mysql://localhost:3306/gestion_bp" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="" />
</beans:bean>
<beans:bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <beans:property name="dataSource" ref="datasource" />
    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.show_sql">true</beans:prop>
            <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop>
            <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
            </beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>


<context:component-scan base-package="com.sqli.bap" />
<beans:bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>
<tx:annotation-driven transaction-manager="transactionManager" />

<beans:bean id="personneDao" class="com.sqli.bap.daoImpl.PersonneDaoImpl"/> 
<beans:bean id="personneMetier" class="com.sqli.bap.metierImpl.PersonneMetierImpl"/> 

Exception

ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.sqli.bap.metierImpl.PersonneMetierImpl com.sqli.bap.HomeController.personneMetier; nested exception is java.lang.IllegalArgumentException: Can not set com.sqli.bap.metierImpl.PersonneMetierImpl field com.sqli.bap.HomeController.personneMetier to com.sun.proxy.$Proxy16
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5253)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5543)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.sqli.bap.metierImpl.PersonneMetierImpl com.sqli.bap.HomeController.personneMetier; nested exception is java.lang.IllegalArgumentException: Can not set com.sqli.bap.metierImpl.PersonneMetierImpl field com.sqli.bap.HomeController.personneMetier to com.sun.proxy.$Proxy16
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
    ... 29 more
Caused by: java.lang.IllegalArgumentException: Can not set com.sqli.bap.metierImpl.PersonneMetierImpl field com.sqli.bap.HomeController.personneMetier to com.sun.proxy.$Proxy16
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source)
    at java.lang.reflect.Field.set(Unknown Source)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:510)
    ... 31 more

Can anyone tell me what's can I do to resolve the problem please Thank you a lot

解决方案

You need to change your controller - replace the line

public PersonneMetierImpl personneMetier;

with

public IPersonneMetier personneMetier;

(that is, use interface instead of an implementation).

In some cases (including yours) Spring doesn't use a bean (PersonneMetierImpl) as-is, but wraps it in a proxy. In this case it is a JDK dynamic proxy, which cannot be cast to PersonneMetierImpl, but only to IPersonneMetier (JDK proxies are interface-based). And that is the reason why Spring cannot autowire field PersonneMetierImpl personneMetier.

Oh, and for the same reason (and also because that's what interfaces are for) you should change PersonneMetierImpl class - replace private PersonneDaoImpl personneDao with private IPersonneDao personneDao.

这篇关于Spring不能创建bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆