Spring - @Valid 在调用方法后不起作用

Spring - @Valid not working after calling method

我写了端点示例来理解我的问题的含义。

我意识到由于 @Valid 注释,我的测试没有通过。

例如。如果有人点击旧端点,我有两个端点,需要检查是否设置了电子邮件,因为它有一个 @NotBlank 注释。 但是当我用一组电子邮件询问我的端点时, @Valid 没有被执行我意识到在用无效数据进行测试之后。而且我无法在 oldPutContact 中设置 @Valid 因为有些联系人没有电子邮件。

我的问题是为什么 putContact 没有执行 @Valid 注释。

    @PutMapping(value = "/contact/{contactid}", )
    public String oldPutContact(@RequestBody Contact contact)
        if(StringUtils.isBlank(contact.getEmail())){
            contact.setEmail("randomEmail@ups.cm") ;
        }
        return putContact(contact);
    }
    @PutMapping(value = "/contact/update/{contactid}")
    public String putContact(@RequestBody @Valid Contact contact) {
        contactService.updateContact(contact);
    }

想象一下联系人实体看起来像这样

 @Builder(toBuilder=true)
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Contact {

        private static final String SOME_PATTERN = "";
       private static final String SOME_EMAIL_PATTERN = "";
        private static final String SOME_PATTERN2 = "";
      
        @NotBlank
        private String id;

        @NotNull
        private Boolean isActive;

        @NotBlank
        @Pattern(regexp = SOME_PATTERN)
        private String name;

        @NotBlank
        @Pattern(regexp = SOME_PATTERN)
        private String surname;
        
       @NotBlank
        @Email(regexp = SOME_EMAIL_PATTERN)
        private String email;

        @NotBlank
        @Pattern(regexp = SOME_PATTERN2)
        private String telephone;

    }

首先,您应该为参数定义验证规则。 例如(注意 NotBlank 注释):

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @NotBlank(message = "Name is mandatory")
    private String name;

    @NotBlank(message = "Email is mandatory")
    private String email;

    // standard constructors / setters / getters / toString
    
}

然后你可以在 rest api 控制器中使用有效的注解。 像这样:

@RestController
public class UserController {

    @PostMapping("/users")
    ResponseEntity<String> addUser(@Valid @RequestBody User user) {
        // persisting the user
        return ResponseEntity.ok("User is valid");
    }

    // standard constructors / other methods

}

您不能定义验证规则。所以spring不知道如何验证参数。

更多信息请参考Spring validation

----通过阅读@nusia 的评论,添加以下描述。

从示例代码“public String putContact(@RequestBody @Valid String contact)”,我看不出你在哪里定义了参数 String contact 的 @NotBlank 注释,或者你的意思是类型参数“contact”不是字符串?如果“联系人”的类型是定义的实体并且其电子邮件字段具有 NotBlank 注释。然后从 HTTP PUT 请求调用新端点“putContact”将触发 spring 验证,但如果你的意思是从旧方法“oldPutContact”调用新方法“putContact”,spring 验证将不会被解雇,原因类似于Call spring annotation method from same class.