【发布时间】:2021-10-06 12:20:55
【问题描述】:
我写了端点示例来理解我的问题的含义。
我意识到由于@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;
}
【问题讨论】:
-
你应该如何让 Spring 知道应该如何准确验证传递的字符串?
-
代码是一个例子来理解它的意思。我有一个实体,我在其中使用了很多注释,例如 Pattern、NotNull、NotBlank 等。如果我使用 Valid 注释,我说他需要检查实体中的字段。当我第一次使用 setEmail 访问 oldPutConctact 端点,然后使用 putContact 时,他正在这样做,但不是在上述情况下。如果我只点击 putContact 端点,则考虑 Valid 注释。
-
测试已经完成,但这是测试没有通过的一种情况,我不明白为什么没有执行 VALid 注释
-
显示你传递给
putContact端点的完整模型类,或者至少它是必不可少的部分(电子邮件) -
如果实体只有
String,spring 应该如何验证它?您的方法签名采用Stringnot 您的实体(此putContact(@RequestBody @Valid String contact)是您发布的内容!)。如果这只是一个错字,请删除您拥有的javax.validation依赖项并添加spring-boot-starter-validation。最后,内部调用不会执行@Valid,因为这是您在此处绕过的请求处理的一部分,当与@Validated一起使用时,它也不会工作,因为它使用 AOP,因此它不使用代理使用内部方法调用通过代理。
标签: java spring spring-boot validation