My Spring Boot RestControllerでは、カスタム例外を投げることで、カスタムエラーメッセージをレスポンスボディに渡したいです。私はガイドの後に https://dzone.com/articles/spring-rest-service-exception-handling-
これらは私のコードスニペットです:
UsernotFoundException
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
_
簡易RestController
@RestController
public class CreateRfqController {
@PostMapping("api/create-rfq")
public ResponseEntity<Rfq> newRfq(@RequestBody Rfq newRfq) {
throw new UserNotFoundException("User Not Found");
}
}
_
REST APIを呼び出すとき、私はいつも空のメッセージを入手します:
{
"timestamp": "2020-06-24T18:23:30.846+00:00",
"status": 404,
"error": "Not Found",
"message": "",
"path": "/api/create-rfq"
}
_
代わりに私は欲しい"message": "User Not Found",
_
一段階で私はそれがうまくいっていました。私はある程度の点でめちゃくちゃになったようです。
ログには、ユーザーがテキストが見つからないテキストと正しい例外クラスが表示されます。
24 Jun 2020;20:50:52.998 DEBUG = 145: o.s.w.s.m.a.ResponseStatusExceptionResolver - Resolved [configRestServer.exceptions.UserNotFoundException: User Not Found]
24 Jun 2020;20:50:52.998 DEBUG = 1131: o.s.w.s.DispatcherServlet - Completed 404 NOT_FOUND
24 Jun 2020;20:50:53.003 DEBUG = 91: o.s.w.s.DispatcherServlet - "ERROR" dispatch for POST "/error", parameters={}
24 Jun 2020;20:50:53.006 DEBUG = 414: o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
24 Jun 2020;20:50:53.018 DEBUG = 265: o.s.w.s.m.m.a.HttpEntityMethodProcessor - Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]
24 Jun 2020;20:50:53.018 DEBUG = 91: o.s.w.s.m.m.a.HttpEntityMethodProcessor - Writing [{timestamp=Wed Jun 24 20:50:53 CEST 2020, status=404, error=Not Found, message=, path=/api/create-rf (truncated)...]
24 Jun 2020;20:50:53.038 DEBUG = 1127: o.s.w.s.DispatcherServlet - Exiting from "ERROR" dispatch, status 404
_
私のbuild.gradle.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.3.0.RELEASE'
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security
compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.3.1.RELEASE'
compile group: 'org.Apache.commons', name: 'commons-lang3', version: '3.9'
runtime group: 'com.Oracle', name: 'ojdbc6', version: '11.2.0.3'
compile group: 'com.Sun.mail', name: 'javax.mail', version: '1.6.2'
// https://mvnrepository.com/artifact/org.Apache.httpcomponents/httpclient
compile group: 'org.Apache.httpcomponents', name: 'httpclient', version: '4.5.12'
_
更新:汎用では、いくつかの間違った変数型を自分のRFQオブジェクトに渡してデフォルトのエラーを生成しました。ここでもレスポンスでは、メッセージは空です。
{
"timestamp": "2020-06-24T19:20:18.831+00:00",
"status": 403,
"error": "Forbidden",
"message": "",
"path": "/api/create-rfq"
}
_
回答を表すPOJOを作成します"message": "User Not Found"
public class ExceptionMessage {
String message;
String details;
public ExceptionMessage(String message, String details) {
this.message = message;
this.details = details;
}
//Add getters and setters
}
その後、応答を送信するコントローラアドバイスクラスを追加します。
@ControllerAdvice
public class CustomException {
@ExceptionHandler(UserNotFoundException.class)
public final ResponseEntity<ExceptionMessage> UserNotFoundException(UserNotFoundException ex, WebRequest request) {
ExceptionMessage error = new ExceptionMessage("Not found", ex.getMessage());
return new ResponseEntity<ExceptionMessage>(error, HttpStatus.BAD_REQUEST);
}
}