首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SpringBoot REST Api中调用被覆盖的handleMethodArgumentNotValid?

如何在SpringBoot REST Api中调用被覆盖的handleMethodArgumentNotValid?
EN

Stack Overflow用户
提问于 2019-03-19 23:10:36
回答 2查看 1.3K关注 0票数 1

我正在努力在我的spring boot REST api中调用被覆盖的MethodArgumentNotValidException。我的其他异常处理程序工作起来很棒,但是覆盖标准的handleMethodArgumentNotValid永远不会被触发?

有人知道我错过了什么吗?

Pojo

代码语言:javascript
复制
public class FundsConfirmationRequest {
  @NotNull(message = "Required Parameter: Account Identifier.")
  private String accountId;
  @NotNull(message = "Required Parameter: Transaction Amount.")
  @Digits(integer=12, fraction=5, message = "Fractions limited to 5 digits.")
  private BigDecimal amount;
  @NotNull(message = "Required Paramater: Currency Code.")
  @Size(min = 3, max = 3, message = "Use ISO4217 Currency Code standard.")
  private String ccy;
  private String cardNumber;
  private String payee;

   public FundsConfirmationRequest() { } 
}

Controller-Method:

代码语言:javascript
复制
@RestController("fundsConfirmationController")
@RequestMapping(
        value="/accounts/{accountId}/funds-confirmations"
)
public class FundsConfirmationController implements FundsConfirmationControllerI {

    @GetMapping(
            headers = {"X-CAF-MSGID", "X-AccessToken"},
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE
    )
    public ResponseEntity<?> fundsConfirmation(@RequestHeader(value="X-CAF-MSGID") String messageId,
                                               @RequestHeader(value="X-AccessToken") String accessToken,
                                               @Valid FundsConfirmationRequest requestParams) throws FIClientException, FIParseException {

异常处理程序,通过@RestControllerAdvice

代码语言:javascript
复制
@RestControllerAdvice
public class FundsConfirmationExceptionHandler extends ResponseEntityExceptionHandler {

    //Existing Exception Handlers
    @Override
    public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        System.out.println("Custom handleMethodArgumentNotValid method");
        FundsConfirmationError responseBody = new FundsConfirmationError(HttpStatus.BAD_REQUEST.toString(), "Input Validation Failed. Parameter.: " + ex.getParameter().getParameterName() + " Value.: " + ex.getParameter().getParameter().toString() + " " + ex.getMessage(), Severity.ERROR.toString(), Sources.LOCAL_CAF_API.toString() );
        return ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .header("X-CAF-ResponseID", request.getHeader("X-CAF-MSGID"))
                .body(responseBody);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-20 00:50:34

显然,这是由于Spring的一些“魔法”造成的。这涉及到我不太熟悉的各种概念,因为框架“隐藏”了这种复杂性。

在我的示例中,我有一个'GET‘请求,对于这个请求,我将pathParams/requestParams映射到一个复杂的对象。作为额外的补充,我想对这些参数进行验证。

然而,由于Spring中“数据绑定到复杂对象”的工作方式,因此不需要注释。因此,这是“数据绑定”而不是“方法映射”。此特定情况触发的结果异常不是MethodArgumentNotValid,而是BindException。

Spring如何准确地将数据映射到REST调用中的对象取决于各种因素,如ContentType、使用的注释等。

票数 2
EN

Stack Overflow用户

发布于 2020-01-13 14:53:46

我认为您需要使用@ControllerAdvice添加@Order(Ordered.HIGHEST_PRECEDENCE)注释

代码语言:javascript
复制
@Order(Ordered.HIGHEST_PRECEDENCE)
@RestControllerAdvice
public class FundsConfirmationExceptionHandler extends ResponseEntityExceptionHandler
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55244238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档