下面是dubbo validation的官方文档
https://dubbo.apache.org/zh/docs/advanced/parameter-validation/
我们用的是dubbox 2.8.4版本
有一个参数没传,但是在捕获异常的时候,并没有拿到校验的错误信息,反而报了一个null指针
try {
String say = sayHelloApi.say(req);
System.out.println(say);
} catch (RpcException e) { // 抛出的是RpcException
ConstraintViolationException ve = (ConstraintViolationException) e.getCause();
Set<ConstraintViolation<?>> violations = ve.getConstraintViolations();
System.out.println(violations);
}
看dubbo源码,发现结果为空
com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter
dubbo的请求会经过下面的filter链。有5个filter,会正序执行。
com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper#buildInvokerChain
但在HystrixFilter的时候,返回了一个null值,导致后面的FutureFilter 空指针,见上图
理论上来说,校验不过,应该直接抛异常,类似下图
问题发现:
还以为是自己写代码缺少了配置,但同事发现他的dubbo.2.8.4版本没有这个HystrixFilter。跟官网对比后。发现现在仓库中的2.8.4版本是别人魔改过的。加一个HystrixFilter,还有bug
https://github.com/dangdangdotcom/dubbox/tree/master/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/filter
1.解决办法,按照dubbo包的路径,重写下HystrixFilter,直接返回result=invoker.invoke(invocation),
2.换成原始的dubbox2.8.4的包,原始包没有这个filter。遇到异常直接抛出