出现的问题:
Ssm分布式项目(dubbo+zookeeper),Tomcat 启动后,在(web)消费者端启动报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private cn.edu.aynu.rjxy.service.IItemService cn.edu.aynu.rjxy.controller.ItemController.iItemService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [cn.edu.aynu.rjxy.service.IItemService] 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:334)
|
错误信息是bean创建异常,主要就是其中的 service 自动注入不进去。
错误可能的原因:
(1)dubbo服务(生产者)没有成功注册到zookeeper上
(2)dubbo服务(生产者)注册到zookeeper上了,自动注入写错了
(3)dubbo服务(生产者)注册到zookeeper上了,自动注入也没有错,但是dubbo 生产者注册的名字并不是 itemservice
解决方法:
最好的方式就是安装dubbo-admin,来查看和管理dubbo服务。其实zookeeper 自身的客户端也是可以查看生产者和消费者的。
先来查看消费者:
(0)先查看tomcat的启动加载spring 等的日志信息。
这里尤其注意:
Starting ProtocolHandler[“http-bio-8083”]
这一句才是项目启动成功的标志,如果不出现这句,一直卡在下面这句:
Initializing Spring root WebApplicationContext
就出现问题了。
Dubbo服务生产者没有注册成功
(1)情况1
在tomcat启动后,只加载到信息:Initializing Spring root WebApplicationContext ,一直不再朝下执行,这就是在加载spring 的配置文件时,可能出现了问题。
可能出现问题的方向: 配置数据库连接出错,配置的zookeeper的IP可能错误。因为这些错误不会直接显示,需要配置log4j等日志,配置打印日志的级别为debug才能查看到。
我出现的问题就是zookeeper连接不上,一直在这里卡着,导致dubbo服务无法注册成功。
错误信息:
参考:
https://www.cnblogs.com/kuma/p/7486068.html
(2)情况2
可能出现这个也是错误,信息: No Spring WebApplicationInitializer types detected on classpath ,需要注意。
(3)情况3
Dubbo 的低版本,跟jdk1.8 兼容性不好,所以考虑看是不是版本的问题。
可以降低jdk版本,或者改变dubbo 的版本。
解决的方式(1):
先配置一下log4j 等日志插件
因为在通常的tomcat启动信息中,zookeeper 报错,不会展示出来,或者其他报错,也不会展示出来,所以需要配置log4j日志,并将其日志级别设置在debug以下才能看见。
配置pom.xml :
<dependencies> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> </dependencies> |
配置web.xml :
<!-- 配置加载log4j.peoperties文件路径 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:conf/log4j.properties</param-value> </context-param> <!-- 配置log4j.xml监听器 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> |
特别注意:使用Log4jConfigListener 监听器必须将其放在 spring的ContextLoaderListener 的前面,否则将加载不到。
配置log4j.properties:
配置的位置,在web.xml 中context-param 所写的位置。
# Configure logging for testing: optionally with log file log4j.rootLogger=DEBUG, stdout # log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n |
主要将日志级别设置在 debug 即可。
日志级别:
fatal(致命的) error warn info(普通字段) debug trace(堆栈)
|
配置方式:可以参考
(https://www.cnblogs.com/chen-lhx/p/6170298.html)
(https://www.cnblogs.com/jbelial/archive/2012/06/05/2536814.html) (https://blog.csdn.net/mafly008/article/details/9345203)
我们再次启动项目,查看打印的日志,来做判断,看怎么处理。
解决的方式(2):
查看配置和代码是否编写正确:
通常情况下, 我们配置dubbo的生产者一般都是service,代码:
/** * 商品管理的serviceimpl * * @author gengzi * @time 2018年7月27日13:38:34 * */ @Service("itemServiceImpl") public class ItemServiceImpl implements ItemService {
@Autowired private TbItemMapper itemMapper;
/** * 根据商品id查询商品信息,返回json数据。 * * @param id *商品id * @return TbItem */ @Override public TbItem getTbItemById(long id) { return itemMapper.selectByPrimaryKey(id); }
} |
@Service(”itemServiceImpl”)
通常我们使用@Service 标识为service层,其实跟@Component效果是一样的。
反映到spring的配置文件中就是一个bean。
(1)使用不同的注解配置,可能出错
如果使用dubbo后,在导入@service时,会有两种不同的包:
Spring提供的:
import org.springframework.stereotype.Service;
dubbo提供的:
com.alibaba.dubbo.config.annotation.Service
在dubbo 2.5.8 版本以上,dubbo 提供了以注解的方式来代替dubbo配置。
我们现在依然使用的是 spring 提供的注解。
(2)dubbo 的配置写错了
@Service(”itemServiceImpl”) 注解,就把这个service 的name确定成为了 itemServiceImpl ,如果不写默认的name 就是 类名(首字母小写)。
我们在dubbo 的配置是需要确定,该service 接口的实现类是什么的。具体看配置:
<dubbo:application name="ylf-manager"/> <dubbo:registry protocol="zookeeper"address="192.168.43.104:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo"port="20880" /> <!-- 声明需要暴露的接口--> <dubbo:service interface="club.gsjblog.service.ItemService"ref="itemServiceImpl" timeout="600000" /> |
具体详细的配置,可以查看dubbo 的官方文档
http://dubbo.incubator.apache.org/#!/docs/user/quick-start.md?lang=zh-cn
这里,只说明dubbo:service 中的 ref 引用,默认就是 实现类的类名(首字母小写)即可。
如果使用了@Service(”xxx”),那ref 就是你所写的名字,那就是xxx
解决的方式(3):
最好是安装 dubbo-admin 来查看dubbo 的服务情况,但是如果我们没有安装,可以查看 zookeeper 的客户端,也能查看注册的消费者和生产者。
当我们使用zookeeper 查看生产者时,发现并没有生产者的信息,说明dubbo服务的生产者没有注册到 zookeeper 中,这就需要看是否是链接问题,还是别的问题。
参考网址:
https://www.cnblogs.com/anqli-java/archive/2017/09/29/7610214.html
安装Dubbo服务来查看服务是否正常
这里特别提醒,使用jdk1.8 和在使用dubbo-admin 会出现错误。
两种方法:将jdk降到1.7 。将dubbo的pom文件修改,打包成适用于1.8版本的dubbo-admin
参考网址:https://blog.csdn.net/zx13525079024/article/details/52260141
https://blog.csdn.net/plg17/article/details/65719122
dubbo-admin 的运行需要在jdk1.6 jdk1.7 版本在tomcat 中运行
参考[http://www.05935.com/198/dubboadmin/](http://www.05935.com/198/dubboadmin/)
【dubbo】dubbo-admin与JDK1.8的不兼容
https://blog.csdn.net/hu_zhiting/article/details/74853130
下载dubbo-admin 1.8版本
http://www.itmayun.com/it/files/226631678709806/resource/901920001882583/1.html
这里特别提醒,使用jdk1.8 和在使用dubbo-admin 会出现错误。
两种方法:将jdk降到1.7 。将dubbo的pom文件修改,打包成适用于1.8版本的dubbo-admin
参考网址:https://blog.csdn.net/zx13525079024/article/details/52260141
https://blog.csdn.net/plg17/article/details/65719122
dubbo-admin 的运行需要在jdk1.6 jdk1.7 版本在tomcat 中运行
参考[http://www.05935.com/198/dubboadmin/](http://www.05935.com/198/dubboadmin/)
【dubbo】dubbo-admin与JDK1.8的不兼容
https://blog.csdn.net/hu_zhiting/article/details/74853130
下载dubbo-admin 1.8版本
http://www.itmayun.com/it/files/226631678709806/resource/901920001882583/1.html