Har*_*mer 4 validation spring spring-mvc bean-validation
我想要完成的是在自定义约束中访问我的Spring Session
示例场景:
自定义约束@UniqueEmail验证电子邮件尚未在系统中使用.此验证在编辑端点上执行,如果用户没有更改电子邮件,则应忽略,第1:因为不需要它和第2:因为查询该电子邮件的数据库实际上将返回结果,即用户本身,虽然在没有访问会话的情况下无法告诉它
这有效:
如果我通过@InitBinder使用自定义编辑器的模型属性我可以在验证发生之前在待验证的bean中设置属性,就像这样
@InitBinder(value="myModelObj")
protected void initBinder(WebDataBinder binder, HttpSession session) {
User user = (User) session.getAttribute("user");
binder.registerCustomEditor(User.class, "user", new UidPropertyEditor(user));
}
@RequestMapping(...)
public String updateUser(@Valid @ModelAttribute("myModelObj") MyModelObj form){
...
}
Run Code Online (Sandbox Code Playgroud)
MyModelObj具有将被实际会话用户替换的属性.问题:
这不起作用
新端点必须使用@RequestBody而不是@ModelAttribute,这意味着(afaik)@InitBinder将不再工作,因此失去对会话对象的访问权限.
如何(如果可能)我可以从自定义约束中访问会话?
public class EmailIsUniqueStringValidator implements ConstraintValidator<EmailIsUnique, String> {
@Autowired
private UserDAO userDAO;
HttpSession session; //Somehow initialized
@Override
public void boolean isValid(String email, ConstraintValidatorContext context) {
User user = (User) session.getAttribute("user");
if(user.getEmail().equals(email)){
return true; // No need to validate
}
else if(userDAO.emailInUse(email)) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
非理想方法:
我现在正在做的是手动在控制器中执行与会话相关的验证,这意味着我有2个点执行验证.
这篇文章中还有一些其他有趣的选项,但如果有办法访问会话......
提前致谢
这可以使用RequestContextHolder来实现,如下所示:
public class EmailIsUniqueStringValidator implements ConstraintValidator<EmailIsUnique, String> {
@Autowired
private UserDAO userDAO;
HttpSession session;
@Override
public void boolean isValid(String email, ConstraintValidatorContext context) {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
session = attr.getRequest().getSession();
User user = (User) session.getAttribute("user");
if(user.getEmail().equals(email)){
return true; // No need to validate
}
else if(userDAO.emailInUse(email)) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1079 次 |
| 最近记录: |