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

时间:2018-02-20 14:11:02

标签: spring-boot

尝试配置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。相反,该应用程序只记录一个:

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,它在客户端的浏览器中显示为XML(@RequestMapping(produces = "application/xml"))。

我缺少什么或者我需要配置什么才能为错误处理的响应返回POJO而不是字符串?

目前的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"

1 个答案:

答案 0 :(得分:1)

问题是缺少依赖性。添加:

compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.4'

解决了这个问题。