Spring Boot 2-使用POJO响应的错误处理



尝试配置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);
    }
}

在测试中,当MissingFieldExceptionController类中投掷时,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'

解决了问题。

最新更新