spring的@Autowired无法注入service的bean(springmvc+mybatis)

fwwer 2015-09-28 10:14:30
工程目录:

这个是controller:

@Controller
public class ItemsController {

@Autowired
private ItemsService itemsService;//这里无法自动注入

@RequestMapping("/queryItems")
public ModelAndView qurryItems() throws Exception {

List<ItemsCustom> itemsList = itemsService.findItemsList(null);

ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsList", itemsList);

modelAndView.setViewName("items/itemsList");

return modelAndView;
}
}

这个是service:

public interface ItemsService {
public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception;
}

这个是service的实现类:

public class ItemsServiceImpl implements ItemsService {

@Autowired
private ItemsMapperCustom itemsMapperCustom;

public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)
throws Exception {
return itemsMapperCustom.findItemsList(itemsQueryVo);
}

}

springmvc的配置:

<context:component-scan base-package="com.fww.ssm.controller"/>

<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

applicationContext-service的配置:

<bean id="itemsService" class="com.fww.ssm.service.impl.ItemsServiceImpl"/>

web.xml的配置:


<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF\classes\spring\applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>

下面是报错:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemsController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.fww.ssm.service.ItemsService com.fww.ssm.controller.ItemsController.itemsService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.fww.ssm.service.ItemsService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
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:628)
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.allocate(StandardWrapper.java:864)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2516)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2505)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:619)

百度各种。。有说要加注解@service和注解@Repository的。。都没效果。。
...全文
4679 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
原创小甜甜 2019-08-04
  • 打赏
  • 举报
回复
我也遇到相同的问题,而且最主要的是相同配置下其余的没事
Wu_12138 2018-11-26
  • 打赏
  • 举报
回复
[quote=引用 16 楼 qq_37737903 的回复:] 我也是传智的视频学的,也遇到了同样的问题[/quote 我也是遇到同样的错误,请问怎么解决?急急急急急!!!
huruiyi 2018-08-05
  • 打赏
  • 举报
回复
主要是tomcat和JDK版本的问题,视频上面是 tomcat7和Jdk1.7 ,运行正常...

我尝试 用tomcat9和Jdk1.8 时, 也出现了上面说的问题
qq_37737903 2017-08-20
  • 打赏
  • 举报
回复
我也是传智的视频学的,也遇到了同样的问题
qq_36798995 2017-02-22
  • 打赏
  • 举报
回复
引用 14 楼 qq_24879815 的回复:
我也是这个问题搞了我一天了,到最后才发现其实事务什么的都没有错,就是这个<param-value>WEB-INF/classes/spring/applicationContext-*.xml</param-value>路径写错了,要写完整而且 / 和 \ 要区分开来
具体是什么路径?我是按照传智视频写的,也遇到了这个问题,该怎么解决
qq_24879815 2016-06-22
  • 打赏
  • 举报
回复
我也是这个问题搞了我一天了,到最后才发现其实事务什么的都没有错,就是这个<param-value>WEB-INF/classes/spring/applicationContext-*.xml</param-value>路径写错了,要写完整而且 / 和 \ 要区分开来
一路记忆 2015-09-30
  • 打赏
  • 举报
回复
是web.xml的问题,和事物无关。之前的写法根本找不到,就无法初始化,就加载不了。
做一个梦想家 2015-09-30
  • 打赏
  • 举报
回复
@Autowired 根据类型来找。估计你还得配一个接口bean
咖啡厅 2015-09-29
  • 打赏
  • 举报
回复
要注入的接口只能有一个实现类。你可以试试@Resource(beanId)
fwwer 2015-09-29
  • 打赏
  • 举报
回复 3
引用 6 楼 kukulongzai_123 的回复:
[quote=引用 5 楼 luxiaoshuai 的回复:] 实现类没有声明service,长得这样,有印象不。【@Service】
这位朋友说的有道理。你应该在service层实现类里面加上@service,将服务层注入,才能引用 @Service public class ItemsServiceImpl implements ItemsService { @Autowired private ItemsMapperCustom itemsMapperCustom; public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception { return itemsMapperCustom.findItemsList(itemsQueryVo); } } [/quote] 当时百度时试过,还是报的一样的错,感觉是配置出错导致无法加载那个bean
叶半欲缺 2015-09-29
  • 打赏
  • 举报
回复 1
引用 5 楼 luxiaoshuai 的回复:
实现类没有声明service,长得这样,有印象不。【@Service】
这位朋友说的有道理。你应该在service层实现类里面加上@service,将服务层注入,才能引用 @Service public class ItemsServiceImpl implements ItemsService { @Autowired private ItemsMapperCustom itemsMapperCustom; public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception { return itemsMapperCustom.findItemsList(itemsQueryVo); } }
luxiaoshuai 2015-09-29
  • 打赏
  • 举报
回复 1
实现类没有声明service,长得这样,有印象不。【@Service】
bartholomew4 2015-09-29
  • 打赏
  • 举报
回复
<context:component-scan base-package="com.fww.ssm.controller" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> 注解扫描
王子文龙 2015-09-29
  • 打赏
  • 举报
回复
applicationContext配置文件中有没有加<context:component-scan base-package="com.fww.ssm"/>
Mozhx 2015-09-29
  • 打赏
  • 举报
回复
@Service public class ItemsServiceImpl implements ItemsService { 加上]@Service试下
bartholomew4 2015-09-29
  • 打赏
  • 举报
回复
引用 6 楼 kukulongzai_123 的回复:
[quote=引用 5 楼 luxiaoshuai 的回复:] 实现类没有声明service,长得这样,有印象不。【@Service】
这位朋友说的有道理。你应该在service层实现类里面加上@service,将服务层注入,才能引用 @Service public class ItemsServiceImpl implements ItemsService { @Autowired private ItemsMapperCustom itemsMapperCustom; public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception { return itemsMapperCustom.findItemsList(itemsQueryVo); } } [/quote]楼上的亲这个是spring管理事务用的,现在他没有事务的概念,连数据库都没有,不需要这个
fwwer 2015-09-29
  • 打赏
  • 举报
回复
找到原因了!!当我删掉spring的事务控制transaction后就成功通过了 transaction代码如下:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="delete*" propagation="REQUIRED"/>
			<tx:method name="insert*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.fww.ssm.service.impl.*.*(..))"/>
	</aop:config>
而且web.xml的配置得改成下面这样才可以:

//加载spring配置
<context-param>
    <param-name>contextConfigLocation</param-name>
   <param-value>classpath:spring\applicationContext-*.xml</param-value>//修改了此处
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
现在更纳闷了,求大神解释其原因。。。这样岂不是用不了事务控制了吗???到底哪里冲突了。。
fwwer 2015-09-28
  • 打赏
  • 举报
回复
引用 1 楼 z345434645 的回复:
<context:component-scan base-package="com.fww.ssm.controller"/> 这个改为 <context:component-scan base-package="com.fww.ssm"/>这个试试 或者将Controller 也用bean的形式试试看
试了,不行。。。还是controller里的那个自动注入完全没有作用
邹邹wl 2015-09-28
  • 打赏
  • 举报
回复
<context:component-scan base-package="com.fww.ssm.controller"/> 这个改为 <context:component-scan base-package="com.fww.ssm"/>这个试试 或者将Controller 也用bean的形式试试看

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧