当前位置: 首页 > 知识库问答 >
问题:

spring boot对无效请求的自定义错误响应

江德海
2023-03-14

我有一个实现REST API的spring boot应用程序。我有一个POSTendpoint,它通过@requestbody接收一个对象,这个对象有几个字段,其中一些字段的类型为long。我面临的问题是,当我接收到一个包含字母字符串作为long类型字段值的无效请求有效负载时,应用程序返回一个带有空有效负载的HTTP 400响应,但我希望能够自定义该响应(例如通过@controlleradvice)并提供一些错误描述。然而,直到现在我都没能做到。

请求有效负载对象:

public final class ExchangeRateDTO {
    public final Long provider;
    public final String from;
    public final String to;
    public final BigDecimal amount;
    public final String date;

    public ExchangeRateDTO(Long provider, String from, String to, BigDecimal amount, String date) {
        this.provider = provider;
        this.from = from;
        this.to = to;
        this.amount = amount;
        this.date = date;
    }
}

控制器:

@RestController
@RequestMapping("/v1/exchangerate")
public class ExchangeRateController {
    private CommandBus commandBus;

    @Autowired
    public ExchangeRateController(CommandBus commandBus) {
        this.commandBus = commandBus;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    @Loggable(operationName="AddExchangeRateRequest")
    public void create(@RequestBody ExchangeRateDTO exchangeRate) {
        commandBus.dispatch(new AddExchangeRateCommand(exchangeRate.provider, exchangeRate.from, exchangeRate.to, exchangeRate.amount, exchangeRate.date));
    }
}

ControllerAdvice类:

@RestControllerAdvice
public class ExchangeRateStoreExceptionHandler extends ResponseEntityExceptionHandler {
    private ErrorResponseAdapter errorResponseAdapter;
    private ErrorStatusAdapter errorStatusAdapter;

    public ExchangeRateStoreExceptionHandler() {
        this.errorResponseAdapter = new ErrorResponseAdapter();
        this.errorStatusAdapter = new ErrorStatusAdapter();
    }

    @ExceptionHandler({ValidationError.class})
    protected ResponseEntity<ValidationErrorResponse> handleValidationError(ValidationError error) {
        ValidationErrorResponse errorResponse = errorResponseAdapter.fromValidationError(error);
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({DomainError.class})
    protected ResponseEntity<ErrorResponse> handleDomainError(DomainError error) {
        ErrorResponse errorResponse = errorResponseAdapter.fromDomainError(error);
        HttpStatus errorStatus = errorStatusAdapter.fromDomainError(error);
        return new ResponseEntity<>(errorResponse, errorStatus);
    }

    @ExceptionHandler({Exception.class})
    protected ResponseEntity<ErrorResponse> handleAllOtherExceptions(Exception exception) {
        String message = "There was an unexpected error. Please retry later.";
        ErrorResponse errorResponse = new ErrorResponse(INTERNAL.toString(), message);
        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

示例请求:

curl -vX POST http://localhost:8081/v1/exchangerate \
  -H 'Content-Type: application/json' \
  -d '{
    "provider": 1,
    "from": "USD",
    "to": "EUR",
    "amount": "as",
    "date": "2018-11-22T00:00:00Z"
}'

及其回应:

< HTTP/1.1 400
< Content-Length: 0
< Date: Mon, 11 Mar 2019 16:53:40 GMT
< Connection: close

知道吗?

共有1个答案

严景焕
2023-03-14

您已经扩展了ResponseEntityExceptionHandler,所以您所需要的只是@overridehandleHttpMessageNotReadable方法:

@ControllerAdvice
public class ExchangeRateStoreExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return new ResponseEntity<>(ex.getLocalizedMessage(), status);
    }

}
 类似资料:
  • Apache可以让网站管理员自己自定义对一些错误和问题的响应。 自定义的响应可以定义为当服务器检测到错误或问题时才被激活。 如果一个脚本崩溃并产生"500 Server Error"响应,那么这个响应可以被更友好的提示替换或者干脆用重定向语句跳到其他的URL(本地的或外部的)。 行为 老式的行为 Apache1.3 会响应一些对于用户没有任何意义的错误或问题信息,而且不会将产生这些错误的原因写入日

  • 我通过endpoint与我的laravel服务器通话。我不使用Laravel View,因此无法访问其会话。 当一个需要的请求进来,我需要返回一个响应即etc每个参数?可能吗? 内部: 如果我应该使用字符串消息,而不是laravel重定向没有响应,我使用邮递员,我看到状态200。如何实现我想要的?我想用响应自定义每个必需的参数。

  • 我们已经部署了一个ASP。NET MVC应用于Azure应用程序服务。 如果请求耗时超过230秒,Azure将返回错误页面“500-请求超时。web服务器未能在指定时间内响应。”-https://stackoverflow.com/a/38676086 我们正在进行更改,以确保对网络请求进行更少的处理,但是仍然有可能达到这些限制。有人知道是否有一种方法可以配置自定义错误页面来显示,而不是下面显示的

  • 问题内容: 我正在尝试使用Spring Boot在本地设置DynamoDB。最初,我开始进行设置,并能够通过存储库将其写入/保存到DynamoDB。从那时起,我添加了更多类来构建我的应用程序。现在,当我尝试启动应用程序时,出现以下异常: 我已经广泛搜索了SO和Internet,但是对此没有任何有用的解决方案。该错误消息也具有误导性。 我的项目属于以下层次结构 DynamoDBConfig.java

  • 我正在努力裁剪javax。验证。ConstraintValidator和javax。验证。根据我的需要限制ValidatorContext。我从格式错误的请求正文收到的响应消息始终采用以下形状: <代码> 此消息也以500而不是400错误请求的形式返回。我无法获得工作到解决方案来执行以下操作: 仅包括<代码> 我有以下代码: 向上面的代码发送格式错误的有效负载将导致如下消息: 我希望能够收到以下信