独自例外クラスおよびハンドラを作成
自作の例外クラスを作成し、ハンドラによってエラーメッセージをAPIレスポンスとして返却します。
- 例外クラス
package nob.example.easyapp.exception;
/**
* サンプルの自作例外クラスです。
*
*/
public class SampleException extends Exception {
public SampleException(String message) {
super(message);
}
}
- 例外ハンドラ
package nob.example.easyapp.handler;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import nob.example.easyapp.exception.SampleException;
/**
* サンプル例外のハンドラです。
*
*/
@RestControllerAdvice
public class SampleExceptionHandler {
/**
* サンプル例外が投げられた際のハンドリングを行います。
*
* @param e
* @return 例外メッセージ
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@ExceptionHandler(SampleException.class) // SampleExceptionが投げられた際に動く
public ResponseEntity<SampleExceptionResponse> handleSampleException(SampleException e) {
return new ResponseEntity(new SampleExceptionResponse(e.getMessage()), HttpStatus.UNPROCESSABLE_CONTENT);
}
/**
* サンプル例外発生時のレスポンスボディです。
*
* @param message エラーメッセージ
*/
public record SampleExceptionResponse(String message) {
}
}
上記で例外クラスおよびハンドラを実装し、下記のように例外を投げると例外発生時のレスポンスボディが返ります。
@Override
public LoginOutModel login(LoginInModel inModel) throws SampleException {
if (inModel.name().isBlank()) {
throw new SampleException("ユーザ名を入力してください");
}
return new LoginOutModel(
usersRepository.findByName(inModel.name()).getPassword().equals(inModel.password()));
}