Spring Boot REST @RequestParam未经过验证

时间:2016-07-27 13:50:58

标签: java spring spring-mvc spring-boot

我在网上尝试了很多例子,但是无法让Spring验证我的查询字符串参数。它似乎没有执行REGEX / fail。

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

所需行为

android:icon

由于

3 个答案:

答案 0 :(得分:35)

您需要将@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);
    }
}

答案 1 :(得分: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 :(得分:0)

您的正则表达式不正确

"^[0-9]+(,[0-9]+)*$"

永远不会解析

1,bob

也许,你需要:

"^\w+(,\w+)*$"

如果您还需要解析空行,请使用:

"^(\w+(,\w+)*)?$"