基于dubbo的扩展机制SPI,实现拦截器实现Filter接口
package com.alibaba.dubbo.rpc;
import com.alibaba.dubbo.common.extension.SPI;
@SPI
public interface Filter {
Result invoke(Invoker<?> var1, Invocation var2) throws RpcException;
}
编写自定义拦截器实现
@Activate(group = {Constants.PROVIDER,Constants.CONSUMER})
public class FlashExceptionFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Result result = invoker.invoke(invocation);
if (result.hasException() && result.getException() instanceof ParamValidationException) {
return new RpcResult(BaseResult.failed(result.getException().getMessage()));
}
return result;
}
}
其中注解@Activate指的是注解生效范围,支持多选,消费方和提供方。随后创建文件resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter
这里如果使用的是阿里的包。则需要文件名改成com.alibaba.dubbo.rpc.Filter在文件内编辑
xxxFilter=com.XXX.XXX.filter.FlashExceptionFilter
那么在消费方使用则需要在服务注入的时候指定拦截器
@Reference(group = "order", version = "1.0", timeout = 60000,filter = {"xxxFilter"})
OrderService orderService
如果服务提供方需要使用,则在服务注册的时候也需要指定
@Service(group = "order", version = "1.0", timeout = 60000, filter = {"xxxFilter"})
public class OrderServiceImpl implements OrderService{
//.....
}