非常拦截器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企服之家,中国第一个企服评测及商务社交产业平台。 |