Spring 3带有hibernate CRUD操作的注释:@Autowired没有按预期工作

时间:2015-08-10 09:03:01

标签: spring hibernate spring-mvc annotations spring-3

我目前正在使用Spring 3注释和hibernate 3进行数据库连接。我也必须使用弹簧砖 我的spring-servlet.xml是:

    <context:annotation-config />
<context:component-scan base-package="com.xxx.controller,com.xxx.dao,com.xxx.service" />

<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"
    id="viewResolver">
    <property name="viewClass">
        <value>
            org.springframework.web.servlet.view.tiles2.TilesView
        </value>
    </property>
</bean>
<bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"
    id="tilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/plugin/impl/tiles/springtiles-defs.xml</value>
        </list>
    </property>
</bean>

//Is this required????
<!-- <bean id="MyDAO" class="com.xxxx.MyDAOImpl"></bean>
<bean id="MyService" class="com.xxxx.MyServiceImpl"></bean> -->

我的控制器类:

@Controller
public class myController {

    @Autowired
    private MyService myService;
    public myController() {

    }

    @RequestMapping(value="/index.do", method = RequestMethod.GET)
    protected ModelAndView Submit(HttpServletRequest request, HttpServletResponse response) throws Exception {

        // TODO Auto-generated method stubs
        System.out.println(" Inside the controller ");

</beans>

我的serviceImpl类:

    @Service("MyService")
public class MyServiceImpl implements MyService{

@Autowired
MyDAO myDAO;

我的DaoImpl课程:

   @Repository/*("myDAO")*/
   public class MyDAOImpl implements MyDAO{

List<String> clientList;

 @Autowired
 private SessionFactory sessionFactory;

 private Session session;

 private Session currentSession() {
        return this.sessionFactory.getCurrentSession();
    }

@Override
public List<ClientInfoBean> getClientList(String currentQrt) throws DataStoreException {
    // TODO Auto-generated method stub
    return (List<ClientInfoBean>) this.currentSession().
    createCriteria("Select * from myTable);
}

它仍然提供以下例外情况。

  

org.springframework.beans.factory.BeanCreationException:使用名称&#39; MyController&#39;创建bean时出错:注册自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.xxx.service.MyService com.xxx.controller.MyController.MyService;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型[com.xxx.service.MyService]的限定bean用于依赖:预期至少有1个bean符合此依赖关系的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}       在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)       在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)       在org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:295)

     

引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.xxx.service.MyService com.xxx.controller.MyController.MyService;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型[com.xxx.service.MyService]的限定bean用于依赖:预期至少有1个bean符合此依赖关系的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)       在org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)       ... 97更多

     

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[com.xxx.service.MyService]的限定bean用于依赖:预期至少有1个bean符合此依赖关系的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}       at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:988)       at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:858)       在org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770)       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)       ... 99更多

5 个答案:

答案 0 :(得分:1)

异常清楚地告诉你bean没有配置 NoSuchBeanDefinitionException:没有[com.xxx.service.MyService]类型的限定bean

您可以检查注释中给出的bean名称与参数名称匹配的情况。 myService vs MyService。

同样添加一个setter可能是一个好主意,因为spring可以调用setter来注入依赖项而不是使用Reflection来注入它。

答案 1 :(得分:1)

当您将服务限定为“MyService”时,您可以添加限定符,如下所示。默认情况下,spring应按类型自动装配,因此组件扫描应加载您的服务。如果您在xml中部分定义bean并期望自动装配其他服务,则必须在spring-servlet.xml中添加

@Autowired
  @Qualifier("MyService")
    private MyService myService;

同时将控制器类更改为 MyController 而不是myController。 并且删除构造函数myController(),spring将为您构造控制器bean。尝试删除所有spring bean类中的所有构造函数,spring将为您构建。首先,您可以避免限定bean,删除括号中的名称(“MyService”,“MyDao”等....)

答案 2 :(得分:1)

定义时      @Service("MyService") public class MyServiceImpl implements MyService{ } 要么      @Repository("MyDAO") public class MyDAOImpl implements MyDAO{ } 你实际上是在告诉spring创建名为&#34; MyService&#34; &安培; &#34; MyDAO&#34;

当你定义喜欢的时候      @Autowired private MyService myService; @Autowired private MyDAO myDAO; 你要求从春天给豆子的名字&#34; myService&#34; &安培; &#34; myDAO&#34;

因为spring创建的bean名称与你提出的名称不同,所以它给出了错误。 您必须在@Service&amp;中保留bean的名称。 @Repository注释与接口的变量名相同。

@Service("myService")
public class MyServiceImpl implements MyService{
}

private MyService myService;

答案 3 :(得分:1)

所以问题是你的包裹:

您在com.xxx.servicecom.xxx.dao

中定义了服务和道具

以及您的实施:com.xxx.serviceImplcom.xxx.daoImpl

同时加入<context:component-scan base-package="com.xxx.serviceImpl,com.xxx.daoImpl"/>

您面临的下一个问题是交易管理:

你没有在spring配置中定义它。这是一个如何执行此操作的示例:

<!-- Hibernate 3 Annotation SessionFactory Bean definition-->
<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.jdbc.batch_size">${batchSize}</prop>
        </props>
    </property>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

在此之后,您需要将方法或服务实现标记为@Transactional,以便对此进行初步处理。

答案 4 :(得分:0)

使用

@Service
public class MyServiceImpl implements MyService

而不是

@Service("MyService")
public class MyServiceImpl implements MyService{