为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"}

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

嘻嘻

Spring Boot项目中创建一个表格数据收集功能并将其保存到数据库,通常会涉及到前端页面展示表单让用户输入数据、后端接收并处理数据以及数据库操作。以下是一个简单的步骤概述: 1. **环境配置**: - 安装Spring Boot框架,确保已配置好MySQL或者其他支持JPA的数据库。 - 添加相关的依赖,如Spring Web、Spring Data JPA、Thymeleaf(用于HTML模板)、Spring MVC等。 2. **模型类(Entity)**: 创建一个实体类(例如`TableData.java`),代表表格的数据结构,添加@Entity注解,并设置相应的字段及主键。 ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class TableData { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String column1; private String column2; // 表格的列属性 // getters and setters } ``` 3. **服务类(Service)**: 在`TableDataService.java`中定义方法,接受用户提交的数据,然后将数据实例化成`TableData`对象,最后保存到数据库。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.saveResult; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class TableDataService { private final TableDataRepository tableDataRepository; @Autowired public TableDataService(TableDataRepository tableDataRepository) { this.tableDataRepository = tableDataRepository; } public saveResult<TableData> addTableData(String column1, String column2) { TableData newData = new TableData(); newData.setColumn1(column1); newData.setColumn2(column2); return tableDataRepository.save(newData); } } ``` 4. **控制器(Controller)**: 使用`@PostMapping`处理POST请求,从HTTP请求体获取数据,调用`TableDataService`的服务方法。 ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class SubmitTableController { @Autowired private TableDataService tableDataService; @PostMapping("/submit") public ResponseEntity<?> submitTable(@RequestBody TableDataFormData formData) { TableData data = tableDataService.addTableData(formData.getColumn1(), formData.getColumn2()); // 返回响应结果,比如状态码和消息 return ResponseEntity.ok("数据提交成功"); } } // 如果需要分步验证和绑定数据,可以考虑使用Form类或数据校验库(如Hibernate Validator) class TableDataFormData { private String column1; private String column2; // getters and setters } ``` 5. **前端(HTML/Thymeleaf)**: 创建HTML表单,使用Thymeleaf引擎绑定表单元素到后端控制器。用户填后提交表单,数据通过Ajax发送到服务器。 ```html <form th:action="@{/submit}" method="post"> <input type="text" name="column1" placeholder="第一列"/> <input type="text" name="column2" placeholder="第二列"/> <button type="submit">提交</button> </form> ``` 完成以上步骤后,当你点击“提交”按钮,前端将数据发送给后端,后端会将其保存到数据库中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值