【问题标题】:Spring REST Service Controller not being validate by @PathVariable and @Valid@PathVariable 和 @Valid 未验证 Spring REST 服务控制器
【发布时间】:2016-10-17 09:04:33
【问题描述】:
@Controller
@EnableWebMvc
@Validated
public class ChildController extends ParentController<InterfaceController> implements InterfaceController{

    @Override
    @RequestMapping(value = "/map/{name}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET)
    @ResponseStatus( HttpStatus.OK)
    @ResponseBody   
    public List<Friends> getAllFriendsByName(
        @Valid
        @Size(max = 2, min = 1, message = "name should have between 1 and 10 characters")
        @PathVariable("name") String name,
        @RequestParam(value="pageSize", required=false) String pageSize,
        @RequestParam(value="pageNumber", required=false) String pageNumber,            
        HttpServletRequest request) throws BasicException {

    //Some logic over here;

    return results;
    }

@ExceptionHandler(value = { ConstraintViolationException.class })
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public String handleResourceNotFoundException(ConstraintViolationException e) {
    Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
    StringBuilder strBuilder = new StringBuilder();
    for (ConstraintViolation<?> violation : violations ) {
        strBuilder.append(violation.getMessage() + "\n");
    }
    return strBuilder.toString();
}

您好,我正在尝试对 spring 请求参数进行非常基本的验证,但它似乎没有调用异常处理程序,有人可以指出我正确的方向

附:我不断收到 NoHandlerFoundException

【问题讨论】:

    标签: spring rest validation


    【解决方案1】:

    Spring 不支持使用 @Valid 验证 @PathVariable。但是,您可以在处理程序方法中进行自定义验证,或者如果您坚持使用@Valid,然后编写自定义编辑器,将路径变量值转换为对象,使用 JSR 303 bean 验证,然后在该对象上使用 @Valid。这可能真的有效。

    编辑: 这是第三种方法。您实际上可以欺骗 spring 将您的路径变量视为模型属性,然后对其进行验证。 1. 为您的路径变量编写自定义验证器 2. 为您的路径变量构造一个@ModelAttribute,然后在该模型属性上使用@Validator(不是@Valid,因为它不允许您指定验证器)。

    @Component
    public class NameValidator implements Validator {
        @Override
        public boolean supports(Class<?> clazz) {
            return String.class.equals(clazz);
        }
        @Override
        public void validate(Object target, Errors errors) {
            String name = (String) target;
            if(!StringUtils.isValidName(name)) {
                errors.reject("name.invalid.format");
            }
        }
    }
    
    @RequestMapping(value = "/path/{name}", method = RequestMethod.GET)
    public List<Friend> getAllFriendsByName(@ModelAttribute("name") @Validated(NameValidator.class) String name) {
        // your code
    
        return friends;
    }
    
    @ModelAttribute("name")
    private String nameAsModelAttribute(@PathVariable String name) {
        return name;
    }
    

    【讨论】:

    • 自定义编辑器是什么意思。而且不是@Size一个JSR303注解
    • 我的意思是 PropertyEditororg.springframework.format.Formatter.Formatter 将您的路径变量转换为常规 bean,是的,您是对的 @Size 是 JSR 303 注释。您会看到路径变量是实际 URL 的一部分,因此 spring 假定它自然有效,但如果您想验证,这些都是您的选择。
    • 这是否意味着这个例子或答案是错误的。 stackoverflow.com/questions/35403744/…
    • 我喜欢第三种方法,但假设我的控制器中还有一个方法称为 getById,那么我将如何使用相同的验证器来验证值。现在 id 必须经过另一种验证。验证器是否有可能是动态的,它会根据传递给 ModelAttribute 的字段进行验证
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2014-12-25
    • 2016-04-28
    相关资源
    最近更新 更多