首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

@RequestBody @Valid SomeDTO具有枚举类型的字段,自定义错误消息

基础概念

@RequestBody 是 Spring MVC 中的一个注解,用于将 HTTP 请求体中的 JSON 数据绑定到 Java 对象上。@Valid 是 Java Bean Validation(JSR 380)中的一个注解,用于触发对象的验证。

相关优势

  1. 数据绑定@RequestBody 可以方便地将请求体中的 JSON 数据自动绑定到 Java 对象,简化了数据处理的复杂性。
  2. 数据验证@Valid 可以确保绑定到 Java 对象的数据符合预定义的验证规则,提高数据的准确性和安全性。

类型

  • @RequestBody 是一个方法级别的注解,用于处理 HTTP 请求体。
  • @Valid 是一个字段级别的注解,用于触发对象的验证。

应用场景

当需要处理来自客户端的 JSON 数据,并且需要对这些数据进行验证时,可以使用 @RequestBody@Valid 组合使用。

自定义错误消息

@Valid 验证失败时,默认情况下会返回一个通用的错误消息。为了提供更友好的错误信息,可以自定义错误消息。

示例代码

假设我们有一个 SomeDTO 类,其中包含一个枚举类型的字段:

代码语言:txt
复制
public class SomeDTO {
    @NotNull(message = "枚举类型不能为空")
    @Enumerated(EnumType.STRING)
    private SomeEnum someEnum;

    // getters and setters
}

public enum SomeEnum {
    VALUE1,
    VALUE2,
    VALUE3
}

在控制器中使用 @RequestBody@Valid

代码语言:txt
复制
@RestController
public class SomeController {

    @PostMapping("/some-endpoint")
    public ResponseEntity<?> someEndpoint(@RequestBody @Valid SomeDTO someDTO) {
        // 处理业务逻辑
        return ResponseEntity.ok("Success");
    }
}

自定义错误消息

为了自定义错误消息,可以在 SomeDTO 类中使用 @NotNull@Enumerated 注解的 message 属性:

代码语言:txt
复制
public class SomeDTO {
    @NotNull(message = "枚举类型不能为空")
    @Enumerated(EnumType.STRING)
    private SomeEnum someEnum;

    // getters and setters
}

处理验证错误

当验证失败时,Spring MVC 会抛出 MethodArgumentNotValidException 异常。可以通过全局异常处理器来捕获并处理这个异常:

代码语言:txt
复制
@ControllerAdvice
public class GlobalExceptionHandler {

    @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);
    }
}

参考链接

通过以上配置,当 SomeDTO 中的枚举类型字段验证失败时,会返回自定义的错误消息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

优雅的参数校验与全局异常-代码规范的天生落地

# 嵌套校验 嵌套校验支持用户将@Valid和@Validated混合使用,可用于更复杂的校验 还是以User为例,新增一个friends字段,代表用户的朋友们,同时加上@Valid注解代表如果friends...本文主要考虑4种较为通用的场景下自定义注解的实现方法 场景1:字段为基础类型,约束传递的字段只能在枚举code的约束范围内,虽然定义字段为枚举字段可以简单实现传输枚举对象名完成枚举约束,但通常我们不将字段本身定义为枚举直接暴露给前端...,当如参数传入为String类型字段,但接收方为Integer类型。...全局异常处理的逻辑非常简单,拿到异常后将异常消息包装进返回体即可。同时我们可以结合任意分布式链路跟踪系统,打印唯一请求id及错误消息,在debug模式下开启堆栈的跟踪。做到前后端均有兜底感知。...RPC全局异常: 捕获的入口为Dubbo RPC接口,如调用方需要识别异常来进行重试等操作需要改变代码 如调用方采用识别isSuccess标识,判断接口调用是否成功,则无需改变代码 # 可扩展性分析 所有的自定义异常都具有

2.5K41

后端表单验证JSR303

1、引入依赖 2、自定义验证规则 3、校验捕获异常错误 第一种:controller捕获 第二种:统一异常捕获 第三种:统一处理配合枚举 4、测试 1、引入依赖 使用JSR303...自定义验证规则,最方便的莫过于使用注解的方式对我们的bean进行验证,并且可以返回我们自己定义的返回消息。...@Valid:首先使用 @Valid 为验证级联标记属性、方法参数或方法返回类型。也就是说我们使用这个注解后验证才生效。...()获取验证后的详细数据 R:我们常常使用JSon数据来进行前后端的数据发送与接收,这里同理,该R为自定的类,如果你不想写自定义的消息类,你可以直接用JSONObject进行数据的保存。...与第二种同理,只是新增枚举统一管理异常的状态码与消息提醒,翻遍代码的修改与查看 1、编写枚举 public enum ExceptionEnum { DATA_EXCEPTION(400,"数据不合法

96730
  • 入参校验1

    默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。...、枚举类、自定义类等);不能是8种基本数据类型 @NotNull 限制必须不为null 任意类型(包括8种基本数据类型及其包装类、String、枚举类、自定义类等);但是对于基本数据类型,没有意义 @Size...) 限制必须符合regexp指定的正则表达式 String @Future 限制必须是一个将来的日期 Date/Calendar @Past 限制必须是一个过去的日期 Date/Calendar @Valid...在这种情况下,我们需要使用自定义的 List 集合来接收参数,即包装 List 类型,并声明 @Valid 注解。...不校验类型(错误) @PostMapping("/test") public void test(@Validated @RequestBody List dto) {

    27040

    【Spring】SpringBoot的10个参数验证技巧

    :第一个是自定义注解UniqueTitle,第二个是正在验证的字段类型(在本例中为String)....我们要确保姓名和电子邮件地址字段不为空,年龄在 18 到 99 岁之间,除了这些字段,如果用户尝试使用重复的“用户名”创建帐户,我们还会提供明确的错误消息或“电子邮件”。...5 将 i18n 用于错误消息 如果你的应用程序支持多种语言,则必须使用国际化 (i18n) 以用户首选语言显示错误消息。...以下是在 Spring Boot 应用程序中使用 i18n 处理错误消息的示例 首先,在资源目录下创建一个包含默认错误消息的 messages.properties 文件 messages.properties...,错误消息将根据随请求发送的“Accept-Language”标头以用户的首选语言显示。

    66140

    【详解】SpringBootValidator校验相关的注解信息

    自定义校验注解除了上述内置的校验注解外,Spring Boot还支持自定义校验注解。通过实现​​ConstraintValidator​​接口,可以创建自己的校验逻辑。...4.1 使用@Valid@PostMapping("/users")public ResponseEntity createUser(@Valid @RequestBody User user...通过合理的使用内置注解和自定义注解,可以有效提升应用的数据校验能力,减少潜在的错误。希望本文能帮助你在实际项目中更好地应用这些校验注解。...示例:​​@NotNull private String name;​​@NotEmpty确保字段不为null且不为空字符串(对于集合类型,确保集合不为空)。...控制器 UserController​:​​@Valid​​ 注解用于触发对 ​​User​​ 对象的校验。​​BindingResult​​ 对象用于捕获校验错误,并返回给客户端。

    14810

    @Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】

    @RequestBody这种类型的入参进行讲解~ 处理入参的处理器:HandlerMethodArgumentResolver,处理@RequestBody最终使用的实现类是:RequestResponseBodyMethodProcessor...(binder, parameter); // 若有错误消息hasErrors(),并且仅跟着的一个参数不是Errors类型,Spring MVC会主动给你抛出MethodArgumentNotValidException...实际上你自定义注解,名称只要一Valid开头都成~~~~~ if (validatedAnn !...自定义注解名称以Valid开头,并且给个value属性同样能够指定Group分组 2....MVC才会把错误消息放权交给调用者处理,否则(没有或者不是紧挨着)它会抛出MethodArgumentNotValidException异常~ 这是使用@RequestBody结合@Valid完成数据校验的基本原理

    3.6K42

    Spring Validation最佳实践及其实现原理,参数校验没那么简单

    但是实际场景中,有可能某个字段也是一个对象,这种情况先,可以使用嵌套校验。比如,上面保存User信息的时候同时还带有Job信息。需要注意的是,此时DTO类的对应字段必须标记@Valid注解。...我们可以使用自定义list集合来接收参数: 包装List类型,并声明@Valid注解 public class ValidationList implements List { @Delegate...业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。...自定义spring validation非常简单,假设我们自定义加密id(由数字或者a-f的字母组成,32-256长度)校验,主要分为两步: 自定义约束注解 @Target({METHOD, FIELD...Documented @Constraint(validatedBy = {EncryptIdValidator.class}) public @interface EncryptId { // 默认错误消息

    1.8K10

    【项目实践】后端接口统一规范的同时,如何优雅得扩展规范?

    code和msg的统一,无论怎样我们只会响应枚举规定好的code和msg。...("/addUser") public ResultVO addUser(@RequestBody @Valid User user, BindingResult bindingResult...自定义注解 如果validation校验失败了,我们可以拿到字段对象并能够获取字段的注解信息,那么只要我们为每个字段带上注解,注解中带上我们自定义的错误码code和错误信息msg,这样就能方便的返回响应体啦...比如,我们可以让注解直接加在整个类上,让某个类都参数用一个错误码;也可以让注解的值设置为枚举类,这样能够进一步的统一规范…… 绕过数据统一响应 上面演示了如何让错误码变得灵活,我们继续进一步扩展。...>> aClass) { // 如果接口返回的类型本身就是ResultVO那就没有必要进行额外的操作,返回false // 如果方法上加了我们的自定义注解也没有必要进行额外的操作

    92921

    hibernate-validator校验参数(统一异常处理)

    实际的业务场景中,对象内字段类型也是对象的场景并不罕见。...针对这种场景,需要在person字段上标注@Valid注解,并且该字段指向的类同样需要标注约束注解。...都可以,总结一下:在使用@RequestBody接收json数据时,必须在方法的参数列表里面使用@Valid或@Validated来告诉hibernate-validator需要校验参数封装实体的字段约束...(被标注到字段上的校验注解),然后在需要嵌套校验的字段上标注@Valid注解,因为@Validated是不能使用在类的字段上的,所以只能使用@Valid 四、分组校验 通常,某些Java Bean在不同的请求之间共享...,这时就要自定义注解来自定义校验规则,举一个典型的应用场景,只接收给定的字符,其它字符都校验不通过。

    1.5K20

    Springboot @Validated参数校验

    但是实际场景中,有可能某个字段也是一个对象,这种情况先,可以使用嵌套校验。 比如,上面保存User信息的时候同时还带有Job信息。需要注意的是,此时DTO类的对应字段必须标记@Valid注解。...我们可以使用自定义list集合来接收参数: 包装List类型,并声明@Valid注解 public class ValidationList implements List { @...业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。...自定义spring validation非常简单,假设我们自定义加密id(由数字或者a-f的字母组成,32-256长度)校验,主要分为两步: 自定义约束注解 @Target({METHOD, FIELD...Documented @Constraint(validatedBy = {EncryptIdValidator.class}) public @interface EncryptId { // 默认错误消息

    1.3K20

    Spring Validation实践及其实现原理

    >[] value() default {}; } @Valid // 用于方法,字段,构造函数,参数,以及泛型类型 @Target({ METHOD, FIELD, CONSTRUCTOR,...} 作用范围不同:@Validated 无法作用在于字段, @Valid 无法作用于类; 注解中的属性不同:@Validated 中提供了指定校验分组的属性,而 @Valid 没有这个功能,因为 @Valid...Controller层 的校验 使用方式 当方法入参为 @RequestBody 注解的 JavaBean,可在入参前使用 @Validated 或 @Valid 注解开启校验。...,决定是否进行字段校验:当存在 @Validated 或以 Valid 开头的注解时,进行校验。...// 实现ConstraintValidator接口,T为注解的类型,R为注解的字段类型 public class UniqueValidator implements ConstraintValidator

    51610

    SpringMVC入门终结篇

    以后写自定义数据类型转换器的时候,就使用FormattingConversionServiceFactoryBean来注册自定义类型转换器,这样就既具有类型转换,又具有格式化功能 后端规定提交的日期格式...,然后通过一个Model对象存储错误信息,放到隐含模型中 jsp页面通过${},从请求域中拿出之前存放的错误信息,显示在页面上 自定义国际化错误消息的显示,Hibernate Validator已经实现了默认的国际化错误消息显示格式...步骤1:编写国际化文件,起名要规范,放在conf资源文件夹下面 注意:国际化文件里面写的key有规定,每一个字段发生错误以后,都会有一个自己的错误代码,国际化资源文件中的错误消息的key必须对应一个错误代码...以后写自定义数据类型转换器的时候,就使用FormattingConversionServiceFactoryBean来注册自定义类型转换器,这样就既具有类型转换,又具有格式化功能 的国际化错误消息显示格式 步骤1:编写国际化文件,起名要规范,放在conf资源文件夹下面 ---- 注意:国际化文件里面写的key有规定,每一个字段发生错误以后

    1.4K30

    【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)

    、@Valid区别 @Validated: Spring提供的 支持分组校验 可以用在类型、方法和方法参数上。...但是不能用在成员属性(字段)上 由于无法加在成员属性(字段)上,所以无法单独完成级联校验,需要配合@Valid @Valid: JDK提供的(标准JSR-303规范) 不支持分组校验 可以用在方法、构造函数...方法参数前加上,@Valid加在学校中的学生属性上,不加则无法对学生对象里的属性进行校验!...测试类 @PostMapping("/add") public Result add(@Valid @RequestBody BrandEntity brandEntity) { return...我们把异常返回给页面 @PostMapping("/add") public Result add(@Valid @RequestBody BrandEntity brandEntity, BindingResult

    85720

    Java Spring JPA 参数校验 JSON 等常用注解 及解析

    设置字段类型 8.4. 指定不持久化特定字段 8.5. 声明大字段 8.6. 创建枚举类型的字段 8.7. 增加审计功能 8.8. 删除/修改数据 8.9. 关联关系 9....其中,ElementType 是一个枚举类型,有以下一些值: ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上 ElementType.FIELD:允许作用在属性字段上 ElementType.METHOD...同样的,它也有一个 value 属性: @Retention(value = RetentionPolicy.RUNTIME 这里的 RetentionPolicy 依然是一个枚举类型,它有以下几个枚举值可取...首先,我们自定义一个注解类型: ? 这里我们指定了 Hello 这个注解只能修饰字段和方法,并且该注解永久存活,以便我们反射获取。...我们有一个注册的接口: @PostMapping("/sign-up") public ResponseEntity signUp(@RequestBody @Valid UserRegisterRequest

    1.4K21

    深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】

    此处还是给个分组校验的使用案例吧: @Getter @Setter @ToString public class Person { // 错误消息message是可以自定义的 @NotNull...提供了一个@Valid注解供以使用,在本文之前,绝大多数小伙伴都是在Controller中并且结合@RequestBody一起来使用它,但在本文之后,你定会对它有个全新的认识~ 该注解用于验证级联的属性...包含字段、方法、类级别上的元数据 // 当然还包含有默认组序列上的元数据(使用较少) public class BeanConfiguration { // 三种来源的枚举 private final...; isValid = validator.isValid( validatedValue, constraintValidatorContext ); ... // 显然校验不通过就返回错误消息...若添加了此注解,那错误消息以它标注的本注解的message为准 所有没有特殊说明的:null is valid。

    5.9K30

    《面试季》高频面试题-Spring篇(二)

    前言 大家好,这里是IT学习日记,相信大家对今年IT的行情应该也有所了解了,从大厂到小厂,各种裁员消息。公司裁员我们无法决定,我们能做的就是不断提升自己,提前准备。...pojo实体的属性上,然后在方法处使用: Valid注解使之生效,BindResult适用于收集是否存在不满足条件的错误信息,也就是校验注解中的message,如果属性也是一个实体,且实体中有需要校验的...,需要在实体的属性字段上添加Valid注解,使用图例如下:   (二): RequestBody的用途   1、前言: 很多人都知道RequestBody注解可以将请求中的参数映射到方法的实体属性中...4、常见的知识误区:   (1) enctype: 表单数据提交时使用的编码类型,默认使用"pplication/x-www-form-urlencoded",如果是使用POST请求,则请求头中的content-type...如果enctype 属性为"multipart/form-data",则以消息的形式发送给服务器。

    41410

    求求你别在用IF ELSE校验参数了

    没有添加分组属性时,默认验证没有分组的验证属性(Default分组); @Validated:可以用在类型、方法和方法参数上,但是不能用在成员属性(字段)上; @Validated:用在方法入参上无法单独提供嵌套验证功能...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...@Valid注解即可(校验对静态变量不生效),在使用 @Valid 注解的参数后可以紧跟着一个 BindingResult 类型的参数,用于获取校验结果(将校验结果封装在BingdingResult对象中...我认为顺序化的校验,场景更多的是在业务处理类,例如联动的属性验证,值的有效性很大程度上不能从代码的枚举或常量类中来校验。...创建自定义注解@Sex,该注解是放在字段上的,也可以根据业务场景放在方法或者Class上面)用于判断性别是否符合约束 @Target({ ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME

    1.9K10
    领券