我目前正在使用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更多
答案 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.service
和com.xxx.dao
以及您的实施:com.xxx.serviceImpl
和com.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{