首页
学习
活动
专区
工具
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.3K41

后端表单验证JSR303

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

96330
  • 入参校验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) {

    26140

    【Spring】SpringBoot10个参数验证技巧

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

    61240

    @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.5K42

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

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

    92421

    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

    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

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

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

    1.4K20

    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

    44810

    SpringMVC入门终结篇

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

    81220

    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.8K30

    《面试季》高频面试题-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",则以消息形式发送给服务器。

    41010

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

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

    1.9K10
    领券