Javaでのパラメータ検証(Spring版以外)
6037 ワード
1.Javaでのパラメータ検証(Spring版以外)
1.1. 前言なぜ私はいつもこのような非正常な問題に直面しているのか、私たちは多くの場合、私たちのパラメータ検査はcontroller層の伝達パラメータに置いて検査を行うことを知っています.私たちがよく使う検査方法は以下のjarパッケージを導入し、パラメータに しかし、私が今直面している需要は、bossが汎用性を追求しているため、私たちのcontroller入口は1つしかありません.パラメータの異なるtradeCodeを入力することで、どのサービスを呼び出すかを区別します.このとき、私はパラメータを検証して具体的な各サービス方法に置かなければなりません.このように私のテストを経て、この注釈を加えることはもう役に立ちません.
1.2. イニシアチブはその注釈を使うことができませんが、私たちはその方法を使うことができます.以下、Javaコードでパラメータを検証する例を書きました.レンガを投げて玉を引くことはできません.自分のシステムで直接使うことはできません.自分のシステムのパッケージ方法と結びつけて、注釈の形式を作るつもりです.spring aopを利用して私のサービス層を切ります.達成された効果はcontroller層と類似している 1.2.1.主な方法
1.2.2.エンティティークラス以上の2つのコードは実体クラスオブジェクトの注釈を検証し、検証が通過しないメッセージを印刷することができ、検証エラーメッセージがある場合に異常 を投げ出すように改造することができる.コードは、groupパケットおよびカスタム注釈 などの詳細にも関連する.
1.2.3.グループ私の例コードには には機能しません.
1.2.4.カスタム注記ここで私は身分証明書番号を検証することを例に、 を使用することができます.
1.3. まとめこの記事では、 コレクションの作者の知識点の整理を訪問することを歓迎して、登録していないのはここをクリックしてください
1.1. 前言
@Validated
を追加し、Bean対象のパラメータに対して異なる注釈処理をすればいいのです.Springという一般的なやり方はよく知っているはずです.
javax.validation
validation-api
1.1.0.Final
@PostMapping("/save/valid")
public RspDTO save(@RequestBody @Validated UserDTO userDTO) {
userService.save(userDTO);
return RspDTO.success();
}
@Data
public class UserDTO implements Serializable {
private static final long serialVersionUID = 1L;
/*** ID*/
@NotNull(message = " id ")
private Long userId;
/** */
@NotBlank(message = " ")
@Length(max = 20, message = " 20 ")
@Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9\\*]*$", message = " : 20 , 、 ")
private String username;
/** */
@NotBlank(message = " ")
@Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = " ")
private String mobile;
/** */
private String sex;
/** */
@NotBlank(message = " ")
@Email(message = " ")
private String email;
/** */
private String password;
/*** */
@Future(message = " ")
private Date createTime;
}
1.2. イニシアチブ
import org.springframework.validation.annotation.Validated;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Date;
import java.util.Set;
import java.util.stream.Stream;
/**
* @author laoliangliang
* @date 2019/10/22 15:19
*/
public class ValidLearn {
public static void main(String[] args) {
ValidLearn learn = new ValidLearn();
learn.testValid(new Order().setIdcard("33062119981012361X").setName(" ").setCreateDate(new Date()));
}
public void testValid(@Validated Order order) {
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
// Insert.class id
Set> validate = validator.validate(order, Insert.class);
Stream.of(validate).forEach(action -> {
for (ConstraintViolation orderConstraintViolation : action) {
String message = orderConstraintViolation.getMessage();
System.out.println(message);
}
});
}
}
1.2.2.エンティティークラス
/**
* @author laoliangliang
* @date 2019/10/21 16:44
*/
@Data
@Accessors(chain = true)
public class Order {
@NotNull(message = "id ",groups = Update.class)
private Long id;
@NotEmpty(message = "name is not null",groups = Insert.class)
private String name;
@Future(message = " ")
private Date createDate;
@IdCardValid(message = "idcard ")
private String idcard;
}
1.2.3.グループ
import javax.validation.groups.Default;
/**
* @author laoliangliang
* @date 2019/10/22 16:32
*/
public interface Update extends Default {
}
import javax.validation.groups.Default;
/**
* @author laoliangliang
* @date 2019/10/22 16:32
*/
public interface Insert extends Default {
}
Insert.class
が使用されています.挿入動作をすると、このパケットが存在する注釈が機能することを示しています.そのため、私はidを伝えず、idが空でない注釈も1.2.4.カスタム注記
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author laoliangliang
* @date 2019/10/22 15:55
*/
public class IdCardValidator implements ConstraintValidator {
private Pattern pattern = Pattern.compile("^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])" +
"\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$");
@Override
public void initialize(IdCardValid idCardValid) {
}
@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
Matcher matcher = pattern.matcher(o.toString());
return matcher.matches();
}
}
/**
* @author laoliangliang
* @date 2019/10/22 15:53
*/
@Documented
@Target({ElementType.PARAMETER,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdCardValidator.class)
public @interface IdCardValid {
String message() default " ";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}
ConstraintValidator
インタフェースを実現するカスタム注釈を書いて、isValid
方法の中でカスタムロジックを実現して注釈1.3. まとめ
Validation
がJavaコードで検証を実現する例を挙げ、service層パラメータ検証に対応し、実際に自分のコードに適用して自分でカスタム注釈を書くことができ、aop接面を実現し、接面の中で検証を行う