@RequestBody @Valid List 无法校验的问题处理

本文探讨了Spring Boot中使用@Valid与@ValidList进行批量数据校验时遇到的问题及解决方案。通过对比不同注解使用方式的效果,提供了一种有效的解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@RequestBody @Valid List 无法校验的问题处理

参考文档:https://blog.youkuaiyun.com/wangjiangongchn/article/details/86481729

我的代码(注意注释描述)


package com.glx.controller.SwaggerController;

import com.glx.model.Person;
import com.glx.model.PersonList;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author:glx
 * @Date:2020/12/22
 * @Content:
 */


@Api(tags= "用户操作接口")
@RestController
public class ApiTest1 {

    @RequestMapping(value="/pushMultiPerson",method = RequestMethod.POST,produces = "application/json;charset=UTF-8")
    @ApiOperation(value = "上传人员资料(多笔)",notes = "上传人员资料(多笔)")
    public void pushMultiPerson(@RequestBody @Valid List<Person> person){//这里的@Valid没有生效

        System.out.println(person);
    }


    @RequestMapping(value="/pushMultiPerson2",method = RequestMethod.POST,produces = "application/json;charset=UTF-8")
    @ApiOperation(value = "上传人员资料(多笔)",notes = "上传人员资料(多笔)")
    public void pushMultiPerson2(@RequestBody @Valid PersonList plist){//这里可以生效,将数组包装成一个类的属性

        System.out.println(plist);
    }




    @RequestMapping(value="/pushOnePerson",method = RequestMethod.POST,produces = "application/json;charset=UTF-8")
    @ApiOperation(value = "上传人员资料(单笔)",notes = "上传人员资料(单笔)")
    public void pushOnePerson(@Valid Person person){//这里的@Valid有效

    }

}

package com.glx.model;

import com.glx.myannotation.FlagValidator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;

/**
 * @Author:glx
 * @Date:2020/12/21
 * @Content:
 */

@Data
@ApiModel(value = "Person", description = "用户信息")
public class Person {

    @NotNull(message = "id不能为空")
    private Integer id;


    @ApiModelProperty(value = "姓名")
    private String strName;

    private Integer age;

    @ApiModelProperty(value = "出生日期",example = "2020-01-01")
    private Date birthDay;

    private Date createDate;

    @FlagValidator(values = "1,2,3,4,5",message = "gender必须是1,2,3,4,5")
    private String gender;

    public Person() {

    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", strName='" + strName + '\'' +
                ", age=" + age +
                ", birthDay=" + birthDay +
                ", createDate=" + createDate +
                ", gender='" + gender + '\'' +
                '}';
    }
}

package com.glx.model;

import lombok.Data;

import javax.validation.Valid;
import java.util.List;

/**
 * @Author:glx
 * @Date:2020/12/22
 * @Content:
 */

@Data
public class PersonList {
    @Valid
    List<Person> personList;

    @Override
    public String toString(){

        String strRet="";
        for(int i=0;i<personList.size();i++){
            strRet +=personList.get(i).toString();
        }
        return strRet;

    }

}

使用@RequestBody注解可以将请求体中的数据绑定到方法的参数上。如果需要对请求体中的数据进行强校验,可以结合使用@Valid注解和校验器(Validator)来实现。 首先,需要定义一个校验器类,该类需要实现Validator接口,并重写validate方法,用于定义校验逻辑。例如,我们定义一个User类作为请求体的实体类,其中包含一个必传项name: ```java public class User { @NotBlank(message = "name不能为空") private String name; // getter和setter方法 } ``` 然后,在控制器方法中使用@Valid注解标注需要校验的参数,并在方法参数中添加BindingResult参数,用于接收校验结果: ```java @PostMapping("/user") public void addUser(@Valid @RequestBody User user, BindingResult result) { if (result.hasErrors()) { // 校验失败,处理错误信息 List<ObjectError> errors = result.getAllErrors(); for (ObjectError error : errors) { System.out.println(error.getDefaultMessage()); } } else { // 校验通过,执行业务逻辑 // ... } } ``` 在上述代码中,@Valid注解用于告诉Spring对user参数进行校验校验结果会存储在BindingResult对象中。如果校验失败,可以通过遍历BindingResult对象中的错误信息来获取具体的校验错误。 需要注意的是,为了使校验生效,还需要在Spring Boot的配置类中添加以下配置: ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new RequestResponseBodyMethodProcessor(resolvers)); } } ``` 这样,当请求体中的必传项缺失时,会返回对应的错误信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值