ToB企服应用市场:ToB评测及商务社交产业平台

标题: dubbo~全局非常拦截器的使用与设计缺陷 [打印本页]

作者: 商道如狼道    时间: 2024-6-7 09:05
标题: dubbo~全局非常拦截器的使用与设计缺陷
非常拦截器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. }
复制代码
相干问题

颠末调试与排查,发现当非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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4