尝试配置Spring Boot 2.x.x Web应用程序,通过根据抛出的异常返回自定义POJO响应来处理错误。为此,我创建了一个示例ErrorHandler
类,如下所示:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.abc.api.model.view.MissingFieldError;
@RestControllerAdvice
public class ErrorHandler {
@ExceptionHandler(MissingFieldException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<MissingFieldError> handleMissingFieldException(MissingFieldException ex, WebRequest req) {
MissingFieldError error = new MissingFieldError();
error.setCode("MISSING_FIELD");
error.setMessage(ex.getMessage());
error.setField(ex.getField());
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
}
在测试中,当MissingFieldException
在Controller
类中投掷时,ErrorHandler
无法按照预期的是MissingFieldError
响应。相反,该应用程序仅记录A:
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/abc] threw exception [Request processing failed; nested exception is org.abc.api.error.MissingFieldException: Field value not specified] with root cause
org.abc.api.error.MissingFieldException
。
如果我更新了ErrorHandler
以返回String
而不是MissingFieldError
,则该错误处理确定,并且调用客户端确实收到了400 Bad Request
。但是我们想返回一个POJO,该POJO显示在客户端的浏览器上显示为XML(@RequestMapping(produces = "application/xml")
(。
我缺少什么或需要配置什么才能返回pojos而不是字符串以获取错误处理的响应?
当前gradle依赖性如下:
compile 'com.fasterxml.jackson.core:jackson-core:2.9.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.4'
compile ("org.springframework.boot:spring-boot-starter:2.0.0.M6") {
exclude group: "org.springframework.boot", module: "spring-boot-starter-logging"
}
compile "org.springframework.boot:spring-boot-starter-web:2.0.0.M6"
问题是缺失的依赖性。添加:
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.4'
解决了问题。