SpringでJSR 303リクエスト制約を使用して空を判定
1.適用シーン
フォームに一連のパラメータをコミットし、バックグラウンドにオブジェクトにカプセル化し、オブジェクトのプロパティにさまざまなフィールド値の制約を行うことがあります.この場合、もちろんif-elseが1つ1つ判断できるので、もっと簡潔な方法があります.JSR 303+springのvalidationを使うことです.
2.使用方法手順(ステップ3) エンティティークラスとフィールド制約注記 Controllerクラスで@Validマークアップ有効(@Validatedも@Valid対応) BindingResultエラーメッセージ を取得
2.1エンティティークラスとフィールド制約注記フロントエンドフォームのフィールドデータをPersonエンティティに収集するには、次の手順に従います.
コンストレイントが必要なフィールドに注釈を付けます.
例:
2.1.1 Person.java
Messageプロパティでは、デフォルトのエラーの説明を変更できます.
2.2 Controllerクラスで@Validマークアップ有効(@Validated互換@Valid)
2.2.1 HelloController.javaフロントエンドContent-Typeがアプリケーション/jsonの場合、JSONメッセージ変換器を使用してJSONオブジェクトに変換します. フロントエンドContent-Typeがアプリケーション/xmlの場合、XMLメッセージ変換器を使用してxmlに変換します. フロントエンドContent-typeがtext/plainの場合、Stringメッセージ変換器でStringに変換します.(タイプがStringの場合のみ変換可能) 2.2.2 Result.java:
2.2.3 ResponseEnum.java
2.3 BindingResultエラーメッセージの取得 3.テストの呼び出し:
3.1要求用例1:フィールドが空
応答:
3.2要求用例2:list無要素/email/urlフォーマットが間違っている
応答:
3.3要求用例3:フィールド情報の完全性
応答:
フォームに一連のパラメータをコミットし、バックグラウンドにオブジェクトにカプセル化し、オブジェクトのプロパティにさまざまなフィールド値の制約を行うことがあります.この場合、もちろんif-elseが1つ1つ判断できるので、もっと簡潔な方法があります.JSR 303+springのvalidationを使うことです.
2.使用方法手順(ステップ3)
2.1エンティティークラスとフィールド制約注記フロントエンドフォームのフィールドデータをPersonエンティティに収集するには、次の手順に従います.
コンストレイントが必要なフィールドに注釈を付けます.
例:
2.1.1 Person.java
package com.niewj.demo.model;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.*;
import java.util.List;
@Data
public class Person {
@Length(min = 4, max = 10)
@NotNull(message = "name ")
private String name;
@Min(0)
@Max(40)
@NotNull(message = "age ")
private Integer age;
@NotBlank
@NotBlank
@URL(message = "logo URL ")
private String logo;
@NotEmpty(message = "hobbies ")
private List hobbies;
@Email
@NotNull(message = "email !")
private String mail;
}
@NotNull
制約フィールドは空であってはならない.@NotEmpty
拘束集合/mapなどは空ではなく0要素ではありません@Email
制約はemail形式です@URL
制約はurlのフォーマットでなければなりませんMessageプロパティでは、デフォルトのエラーの説明を変更できます.
2.2 Controllerクラスで@Validマークアップ有効(@Validated互換@Valid)
2.2.1 HelloController.java
package com.niewj.demo.controller;
import com.google.gson.Gson;
import com.niewj.demo.common.Result;
import com.niewj.demo.model.Person;
import com.niewj.demo.service.TestService1;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;
/**
* test
*
* @author niewj
* @since 2020/11/16 15:22
*/
@Controller
public class HelloController {
/**
* @param person
* @param bindingResult
* @return
*/
@PostMapping("/test")
@ResponseBody
public Result doSth(@Valid @RequestBody Person person, BindingResult bindingResult) {
Map map = new HashMap<>();
if (bindingResult.hasErrors()) {
bindingResult.getFieldErrors().stream().forEach(fe-> map.put(fe.getField(), fe.getDefaultMessage()));
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return Result.withErrorParamData(map);
}
return Result.withSuccessData(person);
}
}
@RequestBody
は、bodyの要求フロー情報(Request.getInputStream)をHttpMessageConverterによってターゲットjavaタイプに自動的に変換することができる.package com.niewj.demo.common;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
/**
*
*
* @author niewj
* @since 2020/12/17 18:05
*/
@Data
public class Result implements Serializable {
private int code;
private String msg;
private T data;
public Result(int code, String msg, T data) {
this(code, msg);
this.data = data;
}
public Result(int code, String msg) {
this.msg = msg;
this.code = code;
}
public static Result withData(ResponseEnum responseCode, T data) {
Result re = new Result(responseCode.getCode(), responseCode.getMsg());
re.data = data;
return re;
}
public static Result withSuccessNoData() {
Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg());
re.data = "";
return re;
}
public static Result withSuccessData(T data) {
Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg());
re.data = data;
return re;
}
public static Result
2.2.3 ResponseEnum.java
package com.niewj.demo.common;
/**
*
*/
public enum ResponseEnum {
SUCCESS(200, " "),
BAD_REQUEST(400, " ");
/**
*
*/
private Integer code;
/**
*
*/
private String msg;
ResponseEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public String getMsg() {
return msg;
}
public Integer getCode() {
return code;
}
}
2.3 BindingResultエラーメッセージの取得
BindingResult
は、制約フィールドのエラー情報を収集するために使用され、bindingResult.hasErrors()
のtrue
によってエラー情報をフィルタリングすることができる.bindingResult.getFieldErrors()
はList
を返します.FieldError
フィールド名:getField()
;エラーメッセージ:getDefaultMessage()
http://localhost:8888/test
3.1要求用例1:フィールドが空
header: Content-Type: application/json
{
"name": "1"
}
応答:
{
"code": 400,
"msg": " ",
"data": {
"mail": "email !",
"hobbies": "hobbies ",
"name": " 4 10 ",
"logo": " ",
"age": "age "
}
}
3.2要求用例2:list無要素/email/urlフォーマットが間違っている
header: Content-Type: application/json
{
"name": "1234",
"hobbies": [],
"mail": "niewj",
"logo": "niewj.com"
}
応答:
{
"code": 400,
"msg": " ",
"data": {
"mail": " ",
"hobbies": "hobbies ",
"logo": "logo URL ",
"age": "age "
}
}
3.3要求用例3:フィールド情報の完全性
header: Content-Type: application/json
{
"name": "1234",
"hobbies": ["running"],
"mail": "[email protected]",
"logo": "http://niewj.com",
"age": 40
}
応答:
{
"code": 200,
"msg": " ",
"data": {
"name": "1234",
"age": 40,
"logo": "http://niewj.com",
"hobbies": [
"running"
],
"mail": "[email protected]"
}
}