java - Spring Boot 验证与 ControllerAdvice 的行为不具有确定性

标签 java spring validation spring-boot

我有以下设置

@ControllerAdvice
public class AppControllerAdvice extends ResponseEntityExceptionHandler {

    @ExceptionHandler({UserInputValidationException.class})
    public ResponseEntity<UserInputValidationResponseBody> handleBadInputException(UserInputValidationException ex, WebRequest request) {
        return new ResponseEntity<>(
                new UserInputValidationResponseBody().setFieldErrors(ex.getFieldErrors()),
                HttpStatus.BAD_REQUEST
        );
    }

}

这大致是抛出格式良好的验证异常的@RestController

@RestController
@RequestMapping("api")
public class MyController {


/**
per the answer, BindingResult must immediately follow the @RequestBody or the item being found
*/
    @PostMapping
    public ResponseEntity<?> foo(@Valid @RequestBody FormPOJO formBody, Principal principal, BindingResult bindingResult) {
        // if bindingResult has errors, throw a UserInputValidationException
    }
}

我想要绑定(bind)的 POJO 上有 JSR-303 验证注释,Spring 在请求参数绑定(bind)期间的绑定(bind)时正确验证它们

然而......虽然我让这个设置工作了一段时间 - 然后 Spring 随机开始绕过 @RestController@ControllerAdvice

看来现在我收到了org.springframework.web.bind.MethodArgumentNotValidException ...即请求正在短路

我正在运行 Spring Boot 1.5.4.RELEASE ...

编辑遵循 another thread 的建议,我添加了

@Order(Ordered.HIGHEST_PRECEDENCE)

给管制员的建议……这只会让事情变得更糟。现在绝对没有验证错误 - 客户端仅收到一条空白消息(这是当前问题出现之前一段时间的问题症状,没有任何代码更改)

最佳答案

好吧,事实证明

An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public org.springframework.http.ResponseEntity com.remo.api.portfolios.PortfolioController.put(java.security.Principal,org.springframework.validation.BindingResult,com.remo.api.portfolios.Portfolio

tl;dr 请继续并确保 IMMEDIATELYBindingResult 之前声明 @RequestBody

关于java - Spring Boot 验证与 ControllerAdvice 的行为不具有确定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45131428/

相关文章:

用于输入日期的 Java JFormattedTextField

json - 验证大型 JSON key

java - 金丝桃 : How to get total of ram in GB?

java - 使用 maven 与 ant : Differences 编译相同的枚举

java - 卡尔曼动态约束Delaunay三角剖分算法的实现

java - Spring - 如何从 Web 应用程序停止和启动 Web 服务?

validation - 仅当验证未失败时,如何使用目标 =“_blank” 在新窗口中打开报告

java - imageView 在 Nexus 5 (Android 6.0) 中不显示

java - Spring + hibernate : a different object with the same identifier value was already associated with the session

java - 动态包含在 JSP 模板中