出现的问题:

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 监听器必须将其放在 springContextLoaderListener 的前面,否则将加载不到。

 

配置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 201872713: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

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐