インターフェイスBindingResultを較正@Validパラメータ

インターフェイスのメソッドは、多くの場合、パラメータは適格性を判断するために、パラメータの中にいくつかのチェックを行う必要がある、と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 测试代码

 

 

 

おすすめ

転載: www.cnblogs.com/z-qinfeng/p/11746260.html