我的错误解决方法:
我遇到的错误是因为@Reference包引入错误,引入的是jdk自带的@Reference,改成alibab的@Reference就好
问题描述:
项目加新功能点之前可以跑通,新加一个功能点之后,不报错也不提示,但前台就是没有数据回显,于是debug查看代码是否携带数据,查看后得到引入的bean为空
解决步骤:
因为之前项目可以跑通,所以也顺带查看了下同包下的controller,比如同个包下的StemealService,成功引入
第一想法是查看了提供者的@Service是不是用错了包,一看是对的,随后去Dubbo-Admin查看了提供者和消费者
查看之后提供者是有注册相应方法的,debug调用了方法,但消费者却没记录,所以焦点锁住了消费者这块,因为之前是可以跑通的,所以相信配置没错,随后一看Reference包名,引用错误,吐血!
在解决问题时候,没有自己动手一步步debug查,是直接就去百度了,查出来的结果都是不对应自己的问题,所以也是花费了很多时间。
附上jdk的Reference讲解连接:
其他解决方法
解决过程中看了很多博客,真应该自己先动手debug的,当然百度也看到了优质的dubbo讲解,引入链接方便大家查看
一个是直接讲解决方法的,当然也有局限,比如就没解决我的问题,但可以对应大多数人
扩展
如果也是消费端引入为null的问题,我相信我的配置是没有问题的,但是你需要检查下,尤其是第一次dubbo注册的服务就调用不了的情况下,很有可能就是配置问题;
提供下我联系时候项目的配置
提供者配置结构
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包下的
消费者配置结构
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>