【问题标题】:Spring Boot REST @RequestParam not being ValidatedSpring Boot REST @RequestParam 未被验证
【发布时间】:2016-12-01 13:53:33
【问题描述】:

我尝试了一些来自网络的示例,但无法让 Spring 验证我的查询字符串参数。似乎没有执行 REGEX / 失败。

package my.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

@RestController
public class MyController {

    private static final String VALIDATION_REGEX = "^[0-9]+(,[0-9]+)*$";

    @RequestMapping(value = "/my/{id}", method = GET)
    public myResonseObject getMyParams(@PathVariable("id") String id,
                                       @Valid @Pattern(regexp = VALIDATION_REGEX) 
                                       @RequestParam(value = "myparam", required = true) String myParam) {
         // Do Stuff!
    }

}

当前行为

PASS - /my/1?myparam=1
PASS - /my/1?myparam=1,2,3
PASS - /my/1?myparam=
PASS - /my/1?myparam=1,bob

期望的行为

PASS - /my/1?myparam=1
PASS - /my/1?myparam=1,2,3
FAIL - /my/1?myparam=
FAIL - /my/1?myparam=1,bob

谢谢

【问题讨论】:

标签: java spring spring-mvc spring-boot


【解决方案1】:

你可以试试这个

@Pattern(regexp="^[0-9]+(,[0-9]+)*$")
private static final String VALIDATION_REGEX;

(注意最后的修饰符) 否则

 @Pattern()
 private static final String VALIDATION_REGEX = "^[0-9]+(,[0-9]+)*$";

然后从您的方法中删除 @Pattern(regexp = VALIDATION_REGEX) 并仅保留 @Valid 注释:

public myResonseObject getMyParams(@PathVariable("id") String id, @Valid @RequestParam(value = "myparam", required = true) String myParam) {

【讨论】:

  • 这甚至无法编译
【解决方案2】:

您需要像这样将@Validated 添加到您的课程中:

@RestController
@Validated
class Controller {
  // ...
}

更新

您需要正确配置它.. 将此 bean 添加到您的上下文中:

@Bean
 public MethodValidationPostProcessor methodValidationPostProcessor() {
      return new MethodValidationPostProcessor();
 }

异常处理示例

@ControllerAdvice
@Component
public class GlobalExceptionHandler {
    @ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Map handle(MethodArgumentNotValidException exception) {
        return error(exception.getBindingResult().getFieldErrors()
                .stream()
                .map(FieldError::getDefaultMessage)
                .collect(Collectors.toList()));
    }


    @ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Map handle(ConstraintViolationException exception) {
        return error(exception.getConstraintViolations()
                .stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.toList()));
    }

    private Map error(Object message) {
        return Collections.singletonMap("error", message);
    }
}

【讨论】:

  • 谢谢,但仍然没有:(我添加了 org.springframework.validation.annotation.Validated;
  • 这给了我一个运行时错误请求:2016-07-27 15:37:01.444 ERROR 10611 --- [nio-8080-exec-1] occC[.[.[/]。 [dispatcherServlet]:servlet [dispatcherServlet] 的 Servlet.service() 在路径 [] 的上下文中抛出异常 [请求处理失败;嵌套异常是 javax.validation.ConstraintViolationException],根本原因是 javax.validation.ConstraintViolationException: null at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:136) ~[spring-context-4.2.7.RELEASE. ....
  • @ptimson 这是'ConstraintViolationException',你所期待的......它基本上说:argument invalid,换句话说,它有效!
  • 两个和我有同样问题的人: 1. 我不需要MethodValidationPostProcessor - 我猜也许我是从别的东西那里免费得到它的,但我还没有检查. 2. 我认为所有与验证相关的注释都在实际的@RestController 上很重要 - 我试图在我的控制器实现的接口中使用它们,但没有运气。 (不是我会选择的模式,而是我继承的模式!)
  • 我可以确认不需要MethodValidationPostProcessor(使用 Spring Boot 1.5.10 测试)
猜你喜欢
  • 2020-07-25
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多