看过上一期踩坑复盘的小伙伴都知道我在启动就报错了,这篇也是😓

一、非法状态异常

1.1 找不 Dubbo 服务的服务提供者

意思是:状态非法异常,找不到 AdminService 这个 Dubbo 服务的服务提供者

常见根因

  1. 提供者服务未启动:提供 AdminService 的后端项目没有运行,没有向 Nacos 注册服务
  2. 注册中心不一致:消费者、提供者连接的不是同一个 Nacos 地址 / 命名空间
  3. 网络不通:本机无法 ping 通 / 访问虚拟机
  4. 启动类缺失 @EnableDubbo 注解:Dubbo 客户端未初始化,无法解析 @DubboReference 订阅服务
  5. @DubboReference 未配置 check=false:默认启动强校验服务存在,提供者离线直接启动崩溃
  6. 提供者未成功注册到 Nacos
  7. 依赖错误

小编排查发现了我问题属于4、5、7:

问题 1: ManagerApiApplication 启动类 缺少 @EnableDubbo 注解,Dubbo 无法正确扫描和处理 @DubboReference

问题 2: shopping_manager_api 的 pom.xml 中直接依赖了 shopping_admin_service,微服务之间通过 Dubbo RPC 通信,不应有 Maven 直接依赖,只需依赖 shopping_common(包含接口定义)。(我当时直接copy了别的模块下的pom,忘修改了😓)

问题3:应添加 check = false 让应用在提供者未启动时也能正常启动。

注解速忆:

(由于学习注解是速通的,很多记得不清晰,在此记录一下)

  • @EnableDubbo :开启 dubbo 功能,识别 @Reference 消费者、@Service 提供者注解。  【SpringBoot 默认不加载 Dubbo 组件,该注解激活 Dubbo 的 Bean 注册、RPC 通信逻辑。】

  • @EnableDiscoveryClient :开启服务注册与发现功能。 【让项目启动后主动把自身服务注册到 Nacos/Eureka 等注册中心,同时能拉取其他服务节点。】

  • @RefreshScope :Nacos 配置变更时动态刷新 Bean 配置。 【普通加载配置是一次性的,注解标记的 Bean 会监听配置中心推送更新。】

  • @MapperScan("com. ...") :扫描 mapper,启动时加载 mapper 接口。 【直接统一扫描,避免 Mapper 无法被注入报错。】

  • @DubboReference(check = false) : 默认启动时 Dubbo 会校验对应服务提供者是否在线,无提供者直接启动报错;设为 false 启动不校验,调用时才判断,适配服务启动顺序不固定场景;true时,容器初始化必须找到服务提供者,找不到直接启动失败


1.2  请求参数类型适配异常

意思是: 非法状态异常:可选 long 类型参数id传值为空,但该参数被定义为基本数据类型,基本类型无法接收 null 值

我当时看这个没明白,后来知道白话就是:

我的接口参数写的是long id(基本数据类型),前端没传 id 参数,Spring 要给这个参数赋值null,long 是基本类型,默认值为 0,不能接受 null,直接抛出异常。

解决方案:long id改成Long id(包装类,支持 null)并显式添加 @RequestParam 注解

这里区分一下这两种路径参数注解:

  • @PathVariable  从 URL 路径中提取参数(如 /delete/1 中的 1
  • @RequestParam  从查询参数中提取(如 /delete?id=1

1.3 启动顺序错误

启动报错如下:

问题:Dubbo 服务注册发现问题(服务提供者不可用

根因

  1. 启动顺序错误:先启动 Dubbo 消费者,提供者还未启动、未注册到 Nacos
  2. 次要诱因:提供者漏写@DubboService注解,服务不会注册注册中心,消费者同样找不到

1.4 总结发现这类错误

经过这几个报错,小编总结发现

 IllegalStateException 报错 在 SpringWeb/Dubbo 开发里,绝大多数场景都是

「配置 / 注解 / 参数 / 组件状态不合法」导致的

  其次就是1.3这种框架层面启动异常

二、测试报错404

之前测试报错500,解决之后有报了404。一开始我对404的报错原因有误解,这里记录一下:

404含义:

服务器接收到请求,但找不到对应接口/资源

可能成因:

  1. 请求路径错误:URL地址拼写、大小写、上下文路径写错。
  2. 请求方式不匹配:接口是@PostMapping,前端用GET访问,反之亦然。
  3. Controller未被Spring扫描:启动类扫描范围没包含控制器包,接口未注册。
  4. @RequestMapping类+方法拼接路径错误:类上前缀+方法路径拼接和访问地址对不上。
  5. 静态资源不存:访问html、图片等静态文件路径错误。
  6. 接口被拦截器直接放行跳过、重定向错误

检查发现是 参数接收注解 + 请求地址不匹配 导致的。

纠正后又报错了,报错显示 是端口被占用了,直接杀死端口就好了,了解到成因是因为,可能之前在关闭运行的时候没有关闭干净导致的。

查找占用 xxx 端口的进程:    netstat -ano | findstr 20881

根据查到的 PID 杀掉进程(把 <PID> 整个替换):    taskkill /PID <PID> /F

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐