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。
界说自界说非常
public class UniqueException extends RuntimeException {
public UniqueException(Throwable cause) {
super(cause);
}
public UniqueException(String message) {
super(message);
}
public UniqueException(String message, Throwable cause) {
super(message, cause);
}
}
复制代码
实现ExceptionMapper
/**
* 数据表约束异常处理器.
*
* @author lind
* @date 2024/6/4 10:45
* @since 1.0.0
*/
@Provider
public class DbViolationExceptionMapper implements ExceptionMapper<UniqueException> {
@Override
public Response toResponse(UniqueException exception) {
return Response.status(Response.Status.BAD_REQUEST)
.entity(MapUtil.builder().put("error", exception.getMessage()).build()).type(MediaType.APPLICATION_JSON)
.encoding("utf-8").build();// 非200的请求,这个type无效,一直是text/plain
/*
* return Response.status(Response.Status.OK)
* .entity(MapUtil.builder().put("error", exception.getMessage()).build())
* .type("application/json; charset=UTF-8").build();//
* 200的请求,是可以使用application/json的
*
*/
}
}
复制代码
注册ExceptionMapper
在文件resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports添加内容
com.xx.exception.handler.DbViolationExceptionMapper
复制代码
业务代码直接抛出非常
if (getCurrentUserId() == null || !getCurrentUserId().equals(userId)) {
throw new UniqueException("权限不足");
}
复制代码
相干问题
当在ExceptionMapper中返回的Response对象,状态码为200时,可以相应为application/json
当Response对象状态码非200时,相应一直是text/plain
颠末调试与排查,发现当非200时,在这个过滤器里,它出现了两个content-type,text/plain不知道是什么时间被加进去的,如图
方法执行到这里时,为相应头添加了text/plain
setStatus()方法如下
public void setStatus(int status) {
if (status > 200) {
this.addOutputHeaders(RestHeaderEnum.CONTENT_TYPE.getHeader(), MediaType.TEXT_PLAIN.value);
}
this.status = status;
}
复制代码
这也是业务代码中,直接报出自界说非常,在ExceptionMapper捕获返回json没有见效的缘故原由,这块感觉dubbo设计的不太好。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4