前提・実現したいこと
reactjsからのPOSTの値に対して、spring bootでカスタムバリデーションを行いたいのですが、フロントエンドから送信されたRequestの中身がnullとして扱われ@NotNullアノテーションに引っ掛かってしまいます。
発生している問題・エラーメッセージ
バックエンド側のエラー
WARN .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<com.example.main.response.Response> com.example.main.controllers.Controller.process(com.example.main.requests.Request) throws java.lang.Exception with 2 errors:
フロント側では、Responseに@NotNullのメッセージが格納されたfieldErrorsが返ってきます。
該当のソースコード
form.js
javascript
1//エラーメッセージ 2const [firstError, setFirstError] = useState(''); 3const [lastError , setLastError ] = useState(''); 4 5const handleSubmit = (evt) =>{ 6 evt.preventDefault(); 7 8 fetch("http://localhost:8080/api/send", { 9 method: "POST", 10 headers: { 11 Accept: "application/json", 12 "Content-Type": "application/json", 13 "X-AUTH-TOKEN":'Bearer '+getToken(),//JWTトークン 14 }, 15 body: JSON.stringify({ 16 First: formData.get('First'), 17 Last: formData.get('Last'), 18 }), 19 }) 20 .then((response)=> response.json()) 21 .then((data) => { 22 if(data.fieldErrors) { 23 data.fieldErrors.forEach(fieldError => { 24 if(fieldError.field === 'First'){ 25 setNodeError(fieldError.message); 26 } 27 if(fieldError.field === 'Last'){ 28 setNetError(fieldError.message); 29 } 30 }); 31 } else { 32 alert("success") 33 } 34 }).catch((err) => err); 35 36const onFirstFocus = (e) =>{ 37 e.preventDefault(); 38 setFirstError(''); 39} 40const onLastFocus = (e) =>{ 41 e.preventDefault(); 42 setLastError(''); 43} 44 45return( 46<form className="col" onSubmit={handleSubmit} noValidate={false}> 47 48 <input className="form" type="text" value="" onFocus={onFirstFocus} name="First"/> 49 { 50 firstError ? <span style={{ color: 'red', fontSize: '12px'}}>{firstError}</span> : '' 51 } 52 <input className="form" type="text" value="" onFocus={onLastFocus} name="Last"/> 53 { 54 lastError ? <span style={{ color: 'red', fontSize: '12px'}}>{lastError}</span> : '' 55 } 56 57 <button type="submit">送信</button> 58</form> 59)
Request.java
java
1@Data 2public class Request{ 3 @NotNull(message = "First is required.") 4 @Pattern(regexp="^[1-9]|[1-9][0-9]|[1-4][0-9]{2}|500$",message = "First is outside the range.")//500まで 5 private String First; 6 7 @NotNull(message = "Last is required.") 8 @Pattern(regexp="^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$",message = "Last is invalid.")//IPv4 9 private String Last; 10}
Controll.java
java
1@RestController 2@RequestMapping("/api") 3@CrossOrigin(origins = "http://localhost:3000") 4public class AuthenticationController { 5 @PostMapping("/send") 6 public ResponseEntity<Response> process(@Validated @RequestBody Request Request) throws Exception{ 7 8 Response Response = new Response(); 9 Response.setData("ok !"); 10 return ResponseEntity.ok(Response); 11 } 12}
ControllerErrorHandler.java
java
1@ControllerAdvice 2public class ControllerErrorHandler extends ResponseEntityExceptionHandler { 3 4 @Override 5 protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, 6 HttpStatus status, WebRequest request) { 7 FieldErrorResponse fieldErrorResponse = new FieldErrorResponse(); 8 9 List<CustomFieldError> fieldErrors = new ArrayList<>(); 10 ex.getBindingResult().getAllErrors().forEach((error) -> { 11 CustomFieldError fieldError = new CustomFieldError(); 12 fieldError.setField(((FieldError) error).getField()); 13 fieldError.setMessage(error.getDefaultMessage()); 14 fieldErrors.add(fieldError); 15 }); 16 17 fieldErrorResponse.setFieldErrors(fieldErrors); 18 return new ResponseEntity<>(fieldErrorResponse, headers, status); 19 } 20}
CustomFieldError.java
java
1public class CustomFieldError { 2 3 private String field; 4 private String message; 5}
FieldErrorResponse.java
java
1public class FieldErrorResponse { 2 3 private List<CustomFieldError> fieldErrors; 4}
Getter,Setterは省略しています。
###試したこと
Request.java内のアノテーションをすべて外しControllクラス内でformからのリクエストを確認しましたが、First,Lastどちらの値もnullになっていました。
補足情報(FW/ツールのバージョンなど)
SpringBoot version : 2.6.2
package.json
"dependencies": { "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^12.1.2", "@testing-library/user-event": "^13.5.0", "axios": "^0.24.0", "bootstrap": "^5.1.3", "react": "^17.0.2", "react-bootstrap": "^2.0.4", "react-dom": "^17.0.2", "react-redux": "^7.2.6", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", "redux": "^4.1.2", "styled-components": "^5.3.3", "web-vitals": "^2.1.2" },
回答1件
あなたの回答
tips
プレビュー