为SpringBoot写一个简单的Response返回数据处理

{"data":{"id":"1","name":"jack"},"code":200,"message":"success"}

为SpringBoot写一个简单的Response返回数据处理

 

对于每次的数据返回处理,是不是很厌烦,每次都要封装对象,形成统一的返回格式

 return ResultVO.success(i);

这次通过aop思想统一处理

@ControllerAdvice ,这个注解,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:

  1. 全局异常处理
  2. 全局数据绑定
  3. 全局数据预处理

灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分别来看。

一、首先定义我们的注解,以便标识哪个类,哪个方法需要用到自动封装处理

import java.lang.annotation.*;


/*
* 返回数据封装
* 第一步注解
* */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@Documented
public @interface ResponseResult {
}

二、设置用于测试的返回数据实体类以及用户实体

@Data
public class Result {

    private Object data;
    private Integer code;
    private String message;

    public Result(Object data, Integer code, String message) {
        this.data = data;
        this.code = code;
        this.message = message;
    }
    public static Result success(Object data) {
        return new Result(data,200,"success");
    }
    public static Result success(Object data, Integer code, String message) {
        return new Result(data,code,message);
    }
    public static Result fail(Object data, Integer code, String message) {
        return new Result(data,code,message);
    }
}
@Data
public class BaseMan {

    String id;
    String name;
}

三、设置一个controller,方便用于实际测试

@RestController
@RequestMapping("/base")
@ResponseResult
public class BaseController {

    @GetMapping("")
    public BaseMan getBaseMans(){
        BaseMan baseMan=new BaseMan();

        baseMan.setId("1");
        baseMan.setName("jack");
        return baseMan;
    }
}

四、设置一个handler处理器,处理这些封装事务

@Slf4j
@ControllerAdvice(annotations = {ResponseResult.class})
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {

//避免重复处理已经做过封装处理的返回值
        final String returnTypeName= methodParameter.getParameterType().getName();
        boolean flag=!"com.example.demo.entity.Result".equals(returnTypeName)
                &&!"org.springframework.http.ResponseEntity".equals(returnTypeName);
        log.info("supports:"+flag);
        return flag;
    }

    @Override
    public Object beforeBodyWrite(Object o,
                                  MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        log.info("before");
        final  String returnTypeName = methodParameter.getParameterType().getName();
        if("void".equals(returnTypeName)){
            return Result.success(null);
        }
        if(!mediaType.includes(MediaType.APPLICATION_JSON)){
            return o;  //返回值不是json类型
        }
        if("com.example.demo.entity.Result".equals(returnTypeName)){
            return o;
        }
        /*
        * 这里我们只处理了正常成功的包装,如果方法体报异常怎么办?处理异常也比较简单,只要判断body是否为异常类。
        * o instanceof Exception
        * */
        return Result.success(o);
    }
}

测试请求

没有设置handler处理返回的结果
{"id":"1","name":"jack"}

处理后的结果
{"data":{"id":"1","name":"jack"},"code":200,"message":"success"}

这个设置处理流程是不够详细的,里面可能还会涉及到 异常抛出时的处理 流程。所以这只是最基本的处理思路,如果有用到,还需要更详细去设计处理流程,尽量考虑到方方面面的情况。

嘻嘻

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用Spring Boot实现分页查询的示例代码: ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserRepository userRepository; @GetMapping("/paged") public ResponseEntity<Page<User>> getPagedUsers( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(defaultValue = "id") String sortBy) { Pageable paging = PageRequest.of(page, size, Sort.by(sortBy)); Page<User> pagedResult = userRepository.findAll(paging); if(pagedResult.hasContent()) { return new ResponseEntity<>(pagedResult, HttpStatus.OK); } else { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } } } ``` 在上面的代码中,我们使用了Spring Boot的`Pageable`和`PageRequest`类来处理分页查询。我们还注入了一个名为`userRepository`的`UserRepository`实例,我们将使用它来执行实际的数据库查询。 在`getPagedUsers`方法中,我们使用`@RequestParam`注解来获取分页查询的参数。其中: - `page`表示需要返回的页码,默认为0。 - `size`表示每页的数据条数,默认为10。 - `sortBy`表示按照哪个字段进行排序,默认为`id`。 我们使用这些参数来创建一个`Pageable`实例,并使用`userRepository.findAll(paging)`方法进行实际的查询。最后,我们将查询结果封装在`ResponseEntity`对象中返回给客户端。 需要注意的是,`Page`对象是一个带有元数据的结果集。如果查询结果为空,我们返回了一个HTTP 404响应。 这就是一个基本的使用Spring Boot实现分页查询的示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值