metacubed:
Spring Beanがで注釈された場合SCOPE_REQUEST
、それが作成され、HTTPリクエストがサーブレットによって受信されるたびに破壊されます。このBeanの作成に失敗した場合、サーバーエラーが呼び出し側に送り返されます。
この簡単な例では、作成のMyInputs
豆は、HTTPリクエストの内容に依存しています。
@Configuration
class ApplicationConfiguration {
@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public MyInputs myInputs(HttpServletRequest request) {
String header1 = request.getHeader("header1");
if (header1 == null) {
throw new MyException("header1 is missing");
}
return new MyInputs(header1);
}
}
HTTPリクエストが必要なヘッダーが含まれていない場合、BeanCreationException
スローされます。これは助けにならない「500内部サーバーエラー」応答に翻訳されます。
私は、例えば、有用なメッセージと「400不正な要求」を、よりユーザーフレンドリーな応答コードと体を返すようにしたいと思います。どのように私はこの応答翻訳をカスタマイズできますか?私はこれを許可する任意のライフサイクルフックを見つけることができません。
注:これはリクエストスコープのBeanが消費された方法です。
@RestController
public class MyController {
private final Provider<MyInputs> myInputsProvider;
@Autowired
public MyController(Provider<MyInputs> myInputsProvider) {
this.myInputsProvider = myInputsProvider;
}
@GetMapping("/do-stuff")
public void doStuff() {
// Get the inputs for the current request
MyInputs myInputs = myInputsProvider.get();
// ...
}
}
ジョナサンJOhx:
あなたは使用することができます@ControllerAdvice
スローされた後、例外を処理するために注釈を。
また、あなたが使用する必要がある@ExceptionHandler
例外を処理するために。
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MyException.class)
public final ResponseEntity<CustomError> handleException(MyException ex, WebRequest request) {
CustomError error = new CustomError();
error.setMessage(ex.getMessage());
error.setStatus(HttpStatus.BAD_REQUEST);
return new ResponseEntity<>(error, null, HttpStatus.BAD_REQUEST);
}
}