Spring BootのRequestBodyAdviceAdapterのサンプルです。
(確認環境:Spring Boot 2.5,JDK 11)
目次
サンプル | RequestBodyAdviceAdapterを確認する |
送信するJSON | |
データを格納するクラス(Syain.java) | |
コントローラのクラス(MainController.java) | |
RequestBodyAdviceAdapterを実装したクラス(TestControllerAdvice) | |
実行される順番の確認 |
RequestBodyAdviceAdapterを確認する
JSONデータを送信しコントローラクラス(MainController.java)で受信します。
その際、RequestBodyAdviceAdapterの機能でJSONの値をオブジェクトに反映する前後に処理を行います。
コントローラで例外も発生させて@ExceptionHandlerとの実行順序も確認します。
以下のURLでアクセスします。
http://localhost:8765/test1
githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/springboot-RequestBodyAdviceAdapter
送信するJSON
{
"syainName":"suzuki"
}
文字列型のJSONです。
データを格納するクラス(Syain.java)
package com.example.test1;
public class Syain{
private String syainName;
public String getSyainName() {
return syainName;
}
public void setSyainName(String syainName) {
this.syainName = syainName;
}
}
4行目は、String型の項目です。
コントローラのクラス(MainController.java)
package com.example.test1;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MainController {
@PostMapping("/test1")
public Syain input1(@RequestBody Syain syain) {
System.out.println("con1=" + syain.getSyainName());
int i = 5;
if (i == 5) {
throw new NullPointerException();
}
System.out.println("con2");
return syain;
}
}
11行目はJSONをSyainクラスで受けます。
15行目は確認のため例外を発生させています。
RequestBodyAdviceAdapterを実装したクラス(TestControllerAdvice)
package com.example.test1;
import java.io.IOException;
import java.lang.reflect.Type;
import javax.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;
@RestControllerAdvice
public class TestControllerAdvice extends RequestBodyAdviceAdapter {
@ExceptionHandler(NullPointerException.class)
public String test(HttpServletRequest request) {
System.out.println("ExceptionHandler");
return request.getLocalAddr();
}
// JSONの内容をSyainオブジェクトに反映する前に実行
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
System.out.println("beforeBodyRead=" + inputMessage.getHeaders());// リクエストヘッダー
return inputMessage;
}
// JSONの内容をSyainオブジェクトに反映した後に実行
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
Syain syain = (Syain)body;
System.out.println("afterBodyRead=" + syain.getSyainName()); //suzuki
syain.setSyainName("i.suzuki");
return body;
}
// beforeBodyRead,afterBodyRead,handleEmptyBodyを実行するか。tureは実行する。
@Override
public boolean supports(MethodParameter methodParameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
System.out.println("supports");
// return false; //実行しない
return true; // 実行する
}
// bodyが空の場合のみ呼び出される
@Override
public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
System.out.println("handleEmptyBody");
return body;
}
}
47行目のreturnでtrueを返すことによりbeforeBodyRead,afterBodyRead,handleEmptyBodyを使用できるようになります。
beforeBodyRead,afterBodyRead,handleEmptyBodyは必須ではなく必要なもののみ追加できます。
24行目のbeforeBodyReadは、JSONの内容をSyainオブジェクトに反映する前に実行します。
26行目は、リクエストヘッダーの内容を出力しています。
33行目のafterBodyReadは、JSONの内容をSyainオブジェクトに反映した後に実行します。
36行目は、JSONからオブジェクトに反映後の値を出力しています。
37行目は、値を変更しています。
52行目のhandleEmptyBodyは、bodyが空(何もなし)の場合のみ呼び出されます。
実行される順番の確認
実行される順番は以下のとおりです。
supports>beforeBodyRead>supports>afterBodyRead>controller>例外発生>ExceptionHandler
関連の記事