我的错误解决方法:

我遇到的错误是因为@Reference包引入错误,引入的是jdk自带的@Reference,改成alibab的@Reference就好

问题描述:

项目加新功能点之前可以跑通,新加一个功能点之后,不报错也不提示,但前台就是没有数据回显,于是debug查看代码是否携带数据,查看后得到引入的bean为空

dubbo 消费者 postman dubbo 消费者url为空_java

解决步骤:

因为之前项目可以跑通,所以也顺带查看了下同包下的controller,比如同个包下的StemealService,成功引入

dubbo 消费者 postman dubbo 消费者url为空_java_02

第一想法是查看了提供者的@Service是不是用错了包,一看是对的,随后去Dubbo-Admin查看了提供者和消费者

dubbo 消费者 postman dubbo 消费者url为空_spring_03

dubbo 消费者 postman dubbo 消费者url为空_java_04

查看之后提供者是有注册相应方法的,debug调用了方法,但消费者却没记录,所以焦点锁住了消费者这块,因为之前是可以跑通的,所以相信配置没错,随后一看Reference包名,引用错误,吐血!

dubbo 消费者 postman dubbo 消费者url为空_dubbo 消费者 postman_05

在解决问题时候,没有自己动手一步步debug查,是直接就去百度了,查出来的结果都是不对应自己的问题,所以也是花费了很多时间。

附上jdk的Reference讲解连接:

其他解决方法

解决过程中看了很多博客,真应该自己先动手debug的,当然百度也看到了优质的dubbo讲解,引入链接方便大家查看

一个是直接讲解决方法的,当然也有局限,比如就没解决我的问题,但可以对应大多数人



扩展

如果也是消费端引入为null的问题,我相信我的配置是没有问题的,但是你需要检查下,尤其是第一次dubbo注册的服务就调用不了的情况下,很有可能就是配置问题;

提供下我联系时候项目的配置

提供者配置结构

dubbo 消费者 postman dubbo 消费者url为空_xml_06

spring-service.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc.xsd
                            http://code.alibabatech.com/schema/dubbo
                            http://code.alibabatech.com/schema/dubbo/dubbo.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 指定应用名称 -->
    <dubbo:application name="health_service_provider"/>
    <!--指定暴露服务的端口,如果不指定默认为20880-->
    <dubbo:protocol name="dubbo" port="20887"/>
    <!--指定服务注册中心地址-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!--批量扫描,发布服务-->
    <dubbo:annotation package="com.itheima.serviceImpl"/>
</beans>

web.xml配置

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 加载spring容器 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:spring*.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

dubbo核心就是这俩个配置文件了,使用的Service注解要是alibab包下的

消费者配置结构

dubbo 消费者 postman dubbo 消费者url为空_java_07

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/mvc
          http://www.springframework.org/schema/mvc/spring-mvc.xsd
          http://code.alibabatech.com/schema/dubbo
          http://code.alibabatech.com/schema/dubbo/dubbo.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes" value="application/json"/>
                <property name="features">
                    <list>
                        <value>WriteMapNullValue</value>
                        <value>WriteDateUseDateFormat</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!-- 指定应用名称 -->
    <dubbo:application name="health_mobile" />
    <!--指定服务注册中心地址-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!--批量扫描-->
    <dubbo:annotation package="com.itheima.controller" />
    <!--
        超时全局设置 10分钟
        check=false 不检查服务提供方,开发阶段建议设置为false
        check=true 启动时检查服务提供方,如果服务提供方没有启动则报错
    -->
    <dubbo:consumer timeout="600000" check="false"/>
    <import resource="spring-redis.xml"></import>
</beans>

俩个值得关注的点,一个是将dubbo直接写在mvc里面,可以避免很多问题,具体原因看深度讲解那个连接;

二需要开启批量扫描,不然即使注册了,也不知道是谁要消费,提供者也是一样需要开启批量扫描;

web.xml 只提供了核心部分

<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>/pages/index.html</welcome-file>
  </welcome-file-list>
</web-app>