インターフェイスのメソッドは、多くの場合、パラメータは適格性を判断するために、パラメータの中にいくつかのチェックを行う必要がある、とjavax.validationパッケージは、いくつかの共通のパラメータが非常に使いやすい、私たちの注意事項を確認しています。
空のパスワードへのオブジェクト参照するかどうか、次の例の試験
1. User.javaを作成します。
輸入javax.validation.constraints.NotBlank。 パブリック クラスユーザー{ プライベート文字列のユーザ名。 @NotBlank プライベート文字列のパスワード。 プライベート整数歳。 }
2.インタフェースメソッド
@PostMapping( "/ユーザ" )、 公衆ユーザーのcreateUser(@Valid @RequestBodyユーザのユーザ){ System.out.printlnは(ユーザ)。 user.setAge( 100 )。 リターンユーザー; }
3.テストコード
@Test 公共 のボイド testCreateUserは()スロー例外を{ 文字列jsonUser = "{\"ユーザー名\ ":\"管理者\ "\ "パスワード\":ヌル}" ; mockMvc.perform(MockMvcRequestBuilders.post( "/ユーザ" ) .contentType(MediaType.APPLICATION_JSON) .content(jsonUser)) .andExpect(MockMvcResultMatchers.status()。ISOK()) .andExpect(MockMvcResultMatchers.jsonPath(「$ .age ").VALUE(" 100" )); }
4.試験結果
テストコードでは、私たちのパスワードは=ヌル、テストに合格していないので、400を報告しました。そしてパスワードは、テストに合格し、以下のnullではありません
5. BindingResult
上記のパラメータでインターフェイスメソッドに渡すことはありませんが、パラメータが渡されていないかどうかを確認、チェックイン、我々は、エラー情報を収集することが良いものではありません.. しかし、春には、それは助けることができる、私たちのJavaクラスBindingResult.javaを提供しています!
注意:@ValidとBindingResultの使用をサポートすることに
5.1インターフェイスコード
( "/ユーザ" @PostMapping ) パブリックユーザのcreateUser(@Valid @RequestBodyユーザーのユーザー、BindingResultエラー){ 場合(errors.hasErrors()){ errors.getAllErrors()ストリーム()forEachの(X。。 - > のSystem.out .println(x.getDefaultMessage()))。 } のSystem.out.println(ユーザ)。 user.setAge( 100 )。 リターンユーザー; }
5.2テストコードと印刷結果
5.3カスタムエラーメッセージ
public class User { private String username; @NotBlank(message = "密码不能为空") private String password; private Integer age; }
6. 自定义注解
javax.validation默认提供了不少的注解,但是有时候,我们需要按照自己的逻辑去自定义注解。
下面举个例子,在创建User对象时,先校验一下数据库是否存在相同的用户名username, 代码如下:
6.1 查询逻辑
@Service public class UserService { /** * 模拟查询,检验admin用户名是否存在 * @param username * @return */ public boolean findUserByUsername(String username) { if (StringUtils.equals(username, "admin")) { return false; } return true; } }
6.2 自定义注解及实现
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) // 该注解的具体实例逻辑类 @Constraint(validatedBy = MyValidatorImpl.class) public @interface MyValidator { String message() default "admin用户已存在"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; }
import org.springframework.beans.factory.annotation.Autowired; import qinfeng.zheng.mockmvcdemo.service.UserService; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * 实现 ConstraintValidator接口的类,spring会将其弄成一个bean */ public class MyValidatorImpl implements ConstraintValidator<MyValidator, String> { @Autowired private UserService userService; @Override public void initialize(MyValidator anno) { System.out.println("初始化。。。。"); } /** * @param value 需要校验的参数值 * @param constraintValidatorContext * @return false : 校验不通过 * true : 校验通过 */ @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { return userService.findUserByUsername(value); } }
6.3 实体类上注解的使用
public class User { @MyValidator private String username; @NotBlank(message = "密码不能为空") private String password; private Integer age; }
6.4 校验接口
@PostMapping("/user") public User createUser(@Valid @RequestBody User user, BindingResult errors) { if (errors.hasErrors()) { errors.getAllErrors().stream().forEach(x-> System.out.println(x.getDefaultMessage())); } System.out.println(user); user.setAge(100); return user; }
6.5 测试代码