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.
我写了端点示例来理解我的问题的含义。
我意识到由于 @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.