我在网上尝试了很多例子,但是无法让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
由于
答案 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+)*)?$"