メモだよ
✏️ パラメータ受け取り
RequestParamでクエリパラメータを取れる。他の取り方もある!
Spring Boot 使い方メモ - Qiita
@GetMapping(value = "/") @ResponseBody String getType(@RequestParam Map<String, String> queryParameters) { .... }
✏️ Objectに変換する
ObjectMapperをつかってmapからObjectにする
クエリパラメータがsnake caseでくる場合は、ObjectMapperに設定を追加する
XXForm form = new ObjectMapper().convertValue(queryParameters, XXXForm.class); XXForm form = new ObjectMapper().setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE).convertValue(queryParameters, XXXForm.class);
✏️ validationを実行する
Formにバリデーションを定義して、Validation実行。
精査に問題があったときは、violationsにエラー情報が設定される。
public class XXXForm { @NotNull public String type; }
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); Validator validator = validatorFactory.getValidator(); Set<ConstraintViolation<Object>> violations = validator.validate(form); if (!violations.isEmpty()) { // バリデーションエラーのときの処理 }
✏️ 全体はこんな感じ
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.validation.*; import java.util.Map; import java.util.Set; @Controller public class AuthenticationController { @GetMapping(value = "/") @ResponseBody String getType(@RequestParam Map<String, String> queryParameters) { XXForm form = getObjectMapper().convertValue(queryParameters, XXXForm.class); validate(authorize); // 正常処理 return ... } private ObjectMapper getObjectMapper() { return new ObjectMapper().setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); } private void validate(Object form) { ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); Validator validator = validatorFactory.getValidator(); Set<ConstraintViolation<Object>> violations = validator.validate(form); if (!violations.isEmpty()) { // バリデーションエラーのときの処理 } } }
import javax.validation.constraints.AssertTrue; import javax.validation.constraints.NotNull; public class XXXForm { @NotNull public String type; public String state; @AssertTrue public boolean isType() { return responseType.equals("hogehoge"); } }
💭 うーーーーん
validationのときに、この値はこういうものだよ!って細かく定義したいけど、それって@AssertTrue使うのかな…?
相関ってわけじゃないので、モヤモヤする〜〜〜。
やりたいこととしては、そもそものプロパティのドメインって感じなんだけどな〜〜〜。
BeanValidationの相関バリデーションとそもそもの話 — 裏紙
上の記事がまさにソレ~!で、ドメインとして定義したい…