【发布时间】: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 结果对象始终显示零错误,并且永远不会调用 validate、supports 或 initBinder 方法。
找到这个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