SpringBoot RequestBodyAdviceAdapterのサンプル

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

関連の記事

SpringBoot 例外のサンプル(ControllerAdvice)

△上に戻る