【问题标题】:Spring - Validation with @Valid is never calledSpring - 使用@Valid 进行验证永远不会被调用
【发布时间】:2018-04-05 23:29:54
【问题描述】:

试图简单地验证我的 bean 的一个字段,而不是手动进行,而是想检查 Spring Validation,但到目前为止还没有多少运气。

简而言之:

当我调用 @RestController 的方法时,似乎永远不会调用带有 @Valid 注释的验证

我的代码:

pom.xml(用于验证部分)

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

Spring 是 4.1.1 版

验证器

package mypackage;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

public class UtenteValidator implements Validator{

    public UtenteValidator() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return UtenteLite.class.equals(clazz);
    }

//validation test
    @Override
    public void validate(Object target, Errors errors) {
        UtenteLite user = (UtenteLite) target;

          if(user.getName != "foo") {
              errors.rejectValue("name", "name not correct");
          }

    }




}

控制器

package myPackage;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/users")
public class UsersController {


    public UsersController() {

    }

//tried to put @InitBinder, but no luck
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new UtenteValidator());
    }

    @ResponseBody
    @RequestMapping(value="", method=RequestMethod.PUT)
    public <T> ResponseEntity<T> aggiornaUtente(@RequestBody @Valid UtenteLite utente, BindingResult result)
    {
        ResponseEntity<T> responseEntity=null;

        return responseEntity;
    }


}

BindingResult 结果对象始终显示零错误,并且永远不会调用 validatesupportsinitBinder 方法。

找到这个tutorial,上面写着:

@InitBinder 方法何时被调用?

@InitBinder 注释方法 如果我们不指定“值”,将在每个 HTTP 请求上调用 此注释的元素。

WebDataBinder 参数特定于模型属性。这意味着 每次 Spring 创建模型属性时,此方法都会得到 使用新的 WebDataBinder 实例调用。

所以我尝试将我的控制器方法更改为添加@ModelAttribute 现在验证代码被调用但 requestBody 对象(“utente”对象)为空,因此验证总是失败因为字段都是空的:

@ResponseBody
    @RequestMapping(value="", method=RequestMethod.PUT)
    public <T> ResponseEntity<T> aggiornaUtente(@RequestBody @Valid @ModelAttribute("utente") UtenteLite utente, BindingResult result)
    { 
...
}

utente 方法参数以 JSON 作为请求的主体传递。

【问题讨论】:

  • 好的,我解决了简单地在我的 pom.xml 中添加休眠验证工件引用我忘了添加它:\ 不知道我是否应该只编辑问题并输入分辨率信息,或者回答它。

标签: java spring validation


【解决方案1】:

好的,

经过几次尝试,我成功地生成了一个可行的解决方案只需在我的 pom.xml 中添加休眠验证工件引用

我错误地认为 hibernate-validator 是强制性的,只有当我在 beans 属性上使用验证注释时(如 @NotNull、@Pattern 等)。

所以只有通过添加这个 sn-p 我才能解决我的问题(希望这可以为其他人节省几个小时的工作):

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.3.Final</version>
</dependency>

现在完整的代码是:

验证器

package mypackage;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

public class UtenteValidator implements Validator{

    public UtenteValidator() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return UtenteLite.class.equals(clazz);
    }

//validation test
    @Override
    public void validate(Object target, Errors errors) {
        UtenteLite user = (UtenteLite) target;

          if(user.getName != "foo") {
              errors.rejectValue("name", "name not correct");
          }

    }




}

控制器

package myPackage;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/users")
public class UsersController {


    public UsersController() {

    }

//tried to put @InitBinder, but no luck
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new UtenteValidator());
    }

    @ResponseBody
    @RequestMapping(value="", method=RequestMethod.PUT)
    public <T> ResponseEntity<T> aggiornaUtente(@RequestBody @Valid UtenteLite utente)
    {
        ResponseEntity<T> responseEntity=null;

        return responseEntity;
    }


}

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2013-10-12
    • 2012-03-27
    • 2013-08-29
    相关资源
    最近更新 更多