当在filter中出现系统异常时,如何定制化返回数据(比如返回给客户端json数据)

当在filter中出现系统异常时,如何定制化返回数据(比如返回给客户端json数据)

需求描述: 一般的情况下Spring中的@ExceptionHandler注解用于统一处理在Controller层抛出的异常。二通常情况下在项目中会使用到很多个第三方的框架,例如Spring,Struts等,有些框架需要配置其过滤器到项目中,当在过滤器中出现异常时,返回给调用端(可以是node,也可以是基于HttpClient的客户端)的信息不易阅读,通常情况下是类似“Server Internal Error”这样的信息,为了友好提示客户端,我们可以定制化此异常信息。具体思路为:在配置的第三方框架的过滤器之前配置一个自定义的过滤器,在这个自定义的过滤器中catch住filterChain.doFilter(request, response);方法,从而在捕获块中定制自定义异常信息,并返回给客户端

  1. 下面是一个自定义的过滤器在web的配置,注意此过滤器一定要配置在其他的过滤器之前
    <filter>
        <filter-name>exceptionHandlerFilter</filter-name>
        <filter-class>com.wusong.client1.filter.ExceptionHandlerFilter</filter-class>
    </filter>


    <filter-mapping>
        <filter-name>exceptionHandlerFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 第三方框架的其他过滤器在这里配置 -->
  1. 自定义过滤器,实例代码如下:
public class ExceptionHandlerFilter extends OncePerRequestFilter {

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            filterChain.doFilter(request, response);
        } catch (Exception e) {

            // 自定义异常的类,用户返回给客户端相应的JSON格式的信息
            FailureResponse errorResponse = new FailureResponse("ST无效");

            response.setContentType("application/json; charset=utf-8");
            response.setCharacterEncoding("UTF-8");

            String userJson = convertObjectToJson(errorResponse);
            OutputStream out = response.getOutputStream();
            out.write(userJson.getBytes("UTF-8"));
            out.flush();
        }
    }

    public String convertObjectToJson(Object object) throws JsonProcessingException {
        if (object == null) {
            return null;
        }
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(object);
    }
}
### JSON API 使用教程和规范 #### 什么是JSON API? JSON API是一种设计、发布以及连接到RESTful HTTP APIs的标准。它旨在减少客户端和服务端开发人员之间沟通的成本,同提高性能并简前端和后端之间的交互过程[^1]。 #### 主要特点 - **统一的数据格式**:所有的请求响应都遵循相同的结构模式; - **链接关系**:能够方便地表示对象间的关系,并允许嵌套加载关联资源; - **批量操作支持**:可以通过单一HTTP请求处理多项变更; - **错误信息标准**:定义了一致的方式来报告问题给调用者; #### 基础概念 ##### 资源 (Resources) 资源是指API所暴露出来的实体,比如用户、文章等。每个资源都有唯一的标识符ID,在URL路径中体现出来。例如`/articles/{id}`代表获取指定编号的文章详情[^4]。 ##### 文档 (Documents) 文档是由服务器返回客户端的一组数据集合体,通常是一个顶级键名为"data"的对象数组或者是单个对象实例。对于包含多个项目的列表查询结果,则会形成一个数组形式的"value"[^5]。 ##### 关联 (Relationships) 当两个或更多不同类型的资源存在逻辑上的联系,就可以建立它们之间的关联。这使得我们可以轻松实现一对多或者一对一这样的复杂场景下的数据检索与更新工作[^2]。 ##### 错误 (Errors) 如果发生任何异常情况,服务端应该按照既定规则构造出相应的错误描述信息发送回给对方。这些提示至少应包含状态码(`status`)、标题(`title`)以及具体原因说明(`detail`)三个部分[^3]。 ```json { "errors": [ { "status": "404", "title": "Not Found", "detail": "The requested resource could not be found." } ] } ``` #### 请求方法 | 方法 | 描述 | | --- | --- | | GET | 获取资源 | | POST | 创建新资源 | | PATCH | 更新现有资源的部分属性 | | DELETE | 删除资源 | #### 查询参数 为了更好地控制返回的内容,可以在GET请求里附加一些特殊的查询字符串来定制输出: - `include`: 指明想要连带取得哪些相关联的数据项。 - `fields[]`: 只选取特定字段而非全部,默认情况下会取所有可用的信息条目。 - `sort`: 对记录按某个条件升序降序排列。 - `page[number], page[size]`: 实现分页显示效果。 #### 示例代码片段 下面给出一段简单的Python程序用来演示如何利用requests库向符合JSON API标准的服务发起读写请求: ```python import requests url = 'http://example.com/api/v1/articles' response = requests.get(url, params={'filter[author]': 'John Doe'}) print(response.json()) new_article_data = {"data":{"type":"article","attributes":{"title":"New Article Title"}}} create_response = requests.post(url, json=new_article_data) print(create_response.status_code) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值