您当前所在位置:首页攻略使用Filter手动捕获异常

使用Filter手动捕获异常

更新:2024-06-11 09:45:56编辑:游戏资讯归类:攻略

上一次的介绍主要围绕如何统一去捕获异常,以及为每一种异常添加自己的Mapper实现。我们知道,当在ExceptionMapper中返回非200的Response时,不支持application/json的响应类型,而是写死的text/plain类型。

参考: https://blog.csdn.net/2401_84048290/article/details/138105184

我们来看看dubbo的源码进行分析。如果Dubbo的provider端抛出异常(Throwable),则会被provider端的ExceptionFilter拦截到,执行以下invoke方法。里面有个实现Listener类,重写了onResponse。我们可以自定义filter来覆盖原来的ExceptionFilter,把自定义的异常通过RuntimeException进行包裹,然后在Mapper中进行统一的捕获。

添加CustomExceptionFilter类型

添加CustomExceptionFilter类型,实现Filter和BaseFilter.Listener,重写onResponse方法,添加自定义代码,如下:

public class CustomExceptionFilter implements Filter, BaseFilter.Listener {
    public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
        	exception = appResponse.getException();
				String className = exception.getClass().getName();

				// 本项目的异常也直接抛出
				if (className.startsWith("com.myself.")) {
					appResponse.setException(new RuntimeException(exception));
					return;
				}
				// 其它原来ExceptionFilter中的代码
    }
}
  • META-INF中注册这个过滤器resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter
customExceptionFilter=com.xxx.register.exception.filter.CustomExceptionFilter
  • 配置中文中注册,并移除默认的resources/application.properties
# 自定义过滤器,上面-exception就是dubbo默认的处理异常的filter,前面-号就代表去除,注意:不需要加双引号
dubbo.provider.filter=customExceptionFilter,-exception

一个Mapper处理所有自定义异常

  • 配置文件中指定mapper,resources/application.properties
dubbo.protocols.http.extension=com.xxx.register.exception.mapper.CustomExceptionMapper
  • mapper源码如下
@Provider
public class DbViolationExceptionMapper implements ExceptionMapper<RuntimeException> {

	@Override
	public Response toResponse(RuntimeException exception) {
		Map<String, String> map = MapUtil.<String, String>builder().put("error", exception.getMessage()).build();
		if (exception.getCause() instanceof ForbiddenException) {
			return Response.status(Response.Status.FORBIDDEN).entity(map).type(MediaType.APPLICATION_JSON).build();
		}
		if (exception.getCause() instanceof CustomException) {
			return Response.status(Response.Status.BAD_REQUEST).entity(map).type(MediaType.APPLICATION_JSON).build();
		}
		if (exception.getCause() instanceof IdentityBrokerException) {
			return Response.status(Response.Status.UNAUTHORIZED).entity(map).type(MediaType.APPLICATION_JSON).build();
		}
		if (exception.getCause() instanceof UniqueException) {
			return Response.status(Response.Status.SERVICE_UNAVAILABLE).entity(map).type(MediaType.APPLICATION_JSON)
					.build();
		}
		return Response.status(Response.Status.SERVICE_UNAVAILABLE)
				.entity(MapUtil.builder().put("error", exception.getMessage()).build()).type(MediaType.APPLICATION_JSON)
				.encoding("utf-8").build();// 非200的请求,这个type无效,一直是text/plain

	}

}

未解决的问题

  • 目前非200的请求,toResponse时,响应类型还是text/plain

以上就是电脑114游戏给大家带来的关于使用Filter手动捕获异常全部内容,更多攻略请关注电脑114游戏。

电脑114游戏-好玩游戏攻略集合版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

《龙腾世纪4》高清截图公布:画风精致 场景极为壮观! 国产游戏《黑神话:悟空》预售开启,虚幻引擎5制作