用SCOPE_REQUEST
注释Spring bean时,每次Servlet收到HTTP请求时,都会创建并销毁它。如果此Bean创建失败,则会将服务器错误发送回调用方。
在这个简单的示例中,MyInputs
bean的创建取决于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 Internal Server Error”响应。
我想返回一个更加用户友好的响应代码和正文,例如带有帮助信息的“ 400 Bad Request”。如何自定义此响应翻译?我找不到任何允许它的生命周期挂钩。
注意:这是使用请求范围的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();
// ...
}
}
答案 0 :(得分:1)
可以使用@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);
}
}