嵌套组合请求对象的校验与全局捕捉

发布于:2024-07-02 ⋅ 阅读:(137) ⋅ 点赞:(0)

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

嵌套组合请求对象的校验与全局捕捉

引言

在现代Web开发中,确保请求数据的有效性是至关重要的,尤其是在处理复杂的嵌套组合请求对象时。本文将详细介绍如何在Spring Boot中进行嵌套组合请求对象的校验,并通过全局异常处理机制捕捉和处理验证错误,确保应用的健壮性和数据的完整性。

1. 请求对象的定义与校验

首先,我们定义了两个请求对象:FlowClientReserveListReqFlowControlReserveUpdateReq。其中FlowClientReserveListReq嵌套在FlowControlReserveUpdateReq中,形成复杂的嵌套组合请求对象。

1.1 定义FlowClientReserveListReq
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class FlowClientReserveListReq {

    @NotNull(message = "流量客户端Id不能为空")
    @ApiModelProperty(required = true, value = "流量客户端Id")
    private Long flowAppId;

    @NotNull(message = "渠道广告位Id不能为空")
    @ApiModelProperty(required = true, value = "媒体广告位Id")
    private Long channelAdId;

    @ApiModelProperty(value = "倍数")
    private Integer times;

    @Min(value = 0, message = "放量数量必须大于或等于零")
    @ApiModelProperty(value = "百分比")
    private Integer percent;

    private Long agentId;
}
1.2 定义FlowControlReserveUpdateReq
package com.middle.bean.req.flow.control;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

@Data
public class FlowControlReserveUpdateReq {

    @NotNull(message = "编号Id不能为空")
    @ApiModelProperty(required = true, value = "编号Id")
    private Long id;

    @Range(min = 1, max = 100, message = "点击率必须大于等于1,小于等于100")
    @NotNull(message = "点击率不能为空")
    @ApiModelProperty(required = true, value = "点击率")
    private Integer clickRate;

    @Valid
    @ApiModelProperty(value = "流量客户端列表")
    private List<FlowClientReserveListReq> clientListReqs;

    @NotBlank(message = "操作人不能为空")
    @ApiModelProperty(required = true, value = "操作人")
    private String opUser;

    @NotNull(message = "代理商id不能为空")
    @ApiModelProperty(value = "代理商ID", required = true)
    private Long agentId;

    private List<Long> channelAdIds;
}

2. 控制器中使用验证

在Spring Boot的控制器中,我们可以使用@Valid注解来触发对请求对象的校验。下面是一个示例:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/api")
public class FlowControlReserveController {

    @PostMapping("/reserve/update")
    public String updateFlowControlReserve(@Valid @RequestBody FlowControlReserveUpdateReq request) {
        // 处理请求逻辑
        return "Flow control reserve updated successfully";
    }
}

3. 全局异常处理

为了更好地处理验证错误,通常会使用全局异常处理器来捕获和处理这些异常。以下是一个示例:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        return ResponseEntity.badRequest().body(errors);
    }
}

4. 详细步骤总结

  1. 定义嵌套组合请求对象

    • 创建FlowClientReserveListReq类,添加必要的验证注解,如@NotNull@Min
    • 创建FlowControlReserveUpdateReq类,包含FlowClientReserveListReq对象的列表,并在字段上使用@Valid注解。
  2. 控制器中启用验证

    • 在控制器方法中,使用@Valid注解修饰请求参数,确保传入的对象满足验证规则。
  3. 全局异常处理

    • 创建全局异常处理器类,使用@ControllerAdvice@ExceptionHandler注解,捕获并处理MethodArgumentNotValidException,返回详细的错误信息。

结论

通过以上步骤,我们实现了对嵌套组合请求对象的校验,并通过全局异常处理机制捕捉和处理验证错误。这种方式不仅提高了数据的完整性和应用的健壮性,还使得代码更加简洁和可维护。在实际开发中,合理使用这些技术,可以大大提升开发效率和用户体验。

希望本文能够帮助你更好地理解和实现嵌套组合请求对象的校验与全局捕捉。如果你有任何疑问或建议,欢迎在评论区讨论。

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到