春天——@Valid调用方法后不工作



我写了一个端点的例子来理解我的问题的含义。

我意识到由于@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验证获取更多信息。

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

从示例代码"public String putContact(@RequestBody @Valid String contact)"中,我看不出您在哪里为参数String contact定义了@NotBlank注释,或者您是指参数的类型"contact"不是弦吗?如果"接触"的类型;是一个已定义的实体,其电子邮件字段具有NotBlank注释。然后调用新端点"putContact"from HTTP PUT请求将触发spring验证,但是如果您的意思是调用新方法putContact"从你的旧方法"oldPutContact"spring验证不会被触发,原因类似于从同一个类调用spring注释方法。

最新更新