2016-07-27 109 views
7

我试过了一些来自net的例子,无法让Spring验证我的查询字符串参数。它似乎没有执行REGEX /失败。Spring Boot REST @RequestParam未验证

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 

感谢

+0

当前的实际行为是什么? –

+0

嗨@HarshilSharma我已经添加了这个。干杯 – ptimson

+0

您可以使用以下来获得您的答案http://stackoverflow.com/questions/2886282/integer-separated-by-comma –

回答

20

您需要添加@Validated到类像这样:

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

UPDATE

您需要正确配置它..这个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); 
    } 
} 
+0

谢谢但仍然没有:(我添加org.springframework.validation.annotation。验证; – ptimson

+0

@ptimson检查更新 – Jaiwo99

+0

这给我一个请求运行时错误: 2016-07-27 15:37:01.444错误10611 --- [nio-8080-exec-1] oaccC [。[。[ ]。[dispatcherServlet]:Servlet.service()用于servlet [dispatcherServlet]与path []的上下文抛出异常[Request processing failed;嵌套的异常是javax.validation.ConstraintViolationException]与根源 javax.validation.ConstraintViolationException:空 \t在org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:136)〜[弹簧上下文4.2。 7.RELEASE ..... – ptimson

0

你可以试试这个

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

从你的方法(注意为final修饰符) 否则

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

,然后删除@Pattern(正则表达式= VALIDATION_REGEX),只保留@Valid注释:

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

您有正确的正则表达式

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

它永远不会解析

1,bob 

也许,你需要:

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

如果你也需要解析一个空行,使用:

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