【问题标题】:@RequestBody as a String is not being validated@RequestBody 作为字符串未被验证
【发布时间】:2022-12-07 21:05:11
【问题描述】:

我有一个简单的控制器,它接受 String 作为RequestBody

  @RequestMapping(value = "/test", method = RequestMethod.POST)
  public ResponseEntity doSmth(@RequestBody @ValidTest String val) {

    //do something
    return ResponseEntity
            .status(HttpStatus.OK)
            .body("saved");
  }

但由于某种原因val param 没有被TestConstraintValidator.class验证

@Documented
@Constraint(validatedBy = TestConstraintValidator.class)
@Target({PARAMETER})
@Retention(RUNTIME)
public @interface ValidTest{
    String message() default "Invalid";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

甚至可以选择验证这一点吗?或者我需要用自定义类包装这个 String 吗?并在那里验证它?

public class TestConstraintValidator implements ConstraintValidator<ValidTest, String> {
    @Override
    public void initialize(ValidTest constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(String val, ConstraintValidatorContext constraintValidatorContext) {
       
        return false;
    }
}

【问题讨论】:

  • 您确定TestConstraintValidator 中的代码没有被触发吗?你可以发布代码吗?
  • @ALex 是的,我确定。我已将@ResponseBody 更改为自定义对象,它只有一个字段。在这个文件的顶部,我添加了注释,它已经开始工作了。但正如我的帖子所述,我不想将它包装在对象中

标签: java spring spring-boot


【解决方案1】:

确保控制器类标记为@Validated

【讨论】:

  • 不幸的是,它没有奏效。如果我将 @Valid 添加到方法参数中,也是如此
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2014-05-08
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多