dubbo~全局非常拦截器的使用与设计缺陷

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

非常拦截器ExceptionMapper

在JAX-RS(Java API for RESTful Web Services)中,ExceptionMapper接口用于将Java非常映射到HTTP相应。通过实现ExceptionMapper接口,你可以自界说如何处置惩罚特定类型的非常,并生成相应的HTTP相应。
优先级和选择

当有多个ExceptionMapper可用于处置惩罚同一类型的非常时,JAX-RS会选择最具体的那个。比方,假如你有一个处置惩罚RuntimeException的ExceptionMapper和一个处置惩罚NullPointerException的ExceptionMapper,那么当抛出NullPointerException时,会选择处置惩罚NullPointerException的ExceptionMapper。
界说自界说非常
  1.     public class UniqueException extends RuntimeException {
  2.         public UniqueException(Throwable cause) {
  3.                 super(cause);
  4.         }
  5.         public UniqueException(String message) {
  6.                 super(message);
  7.         }
  8.         public UniqueException(String message, Throwable cause) {
  9.                 super(message, cause);
  10.         }
  11. }
复制代码
实现ExceptionMapper
  1. /**
  2. * 数据表约束异常处理器.
  3. *
  4. * @author lind
  5. * @date 2024/6/4 10:45
  6. * @since 1.0.0
  7. */
  8. @Provider
  9. public class DbViolationExceptionMapper implements ExceptionMapper<UniqueException> {
  10.         @Override
  11.         public Response toResponse(UniqueException exception) {
  12.                 return Response.status(Response.Status.BAD_REQUEST)
  13.                                 .entity(MapUtil.builder().put("error", exception.getMessage()).build()).type(MediaType.APPLICATION_JSON)
  14.                                 .encoding("utf-8").build();// 非200的请求,这个type无效,一直是text/plain
  15.                 /*
  16.                  * return Response.status(Response.Status.OK)
  17.                  * .entity(MapUtil.builder().put("error", exception.getMessage()).build())
  18.                  * .type("application/json; charset=UTF-8").build();//
  19.                  * 200的请求,是可以使用application/json的
  20.                  *
  21.                  */
  22.         }
  23. }
复制代码
注册ExceptionMapper

在文件resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports添加内容
  1. com.xx.exception.handler.DbViolationExceptionMapper
复制代码
业务代码直接抛出非常
  1. if (getCurrentUserId() == null || !getCurrentUserId().equals(userId)) {
  2.         throw new UniqueException("权限不足");
  3. }
复制代码
相干问题


  • 当在ExceptionMapper中返回的Response对象,状态码为200时,可以相应为application/json
  • 当Response对象状态码非200时,相应一直是text/plain
颠末调试与排查,发现当非200时,在这个过滤器里,它出现了两个content-type,text/plain不知道是什么时间被加进去的,如图

方法执行到这里时,为相应头添加了text/plain

setStatus()方法如下
  1.   public void setStatus(int status) {
  2.         if (status > 200) {
  3.             this.addOutputHeaders(RestHeaderEnum.CONTENT_TYPE.getHeader(), MediaType.TEXT_PLAIN.value);
  4.         }
  5.         this.status = status;
  6.     }
复制代码
这也是业务代码中,直接报出自界说非常,在ExceptionMapper捕获返回json没有见效的缘故原由,这块感觉dubbo设计的不太好。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表