spring @Validated 自定义使用

B-Chen 发布于 2018/06/06 15:51
阅读 2K+
收藏 2

使用spring @Validated进行验证,并将错误信息返回到页面,代码:

1、定义了model

@Getter
@Setter
public class User {
    
    private String userName;
    private String password;
    private String email;
    
}

 

2、自定义UserValidate

public class UserValidate implements Validator {

    @Override
    public boolean supports(Class<?> arg0) {
        System.out.println("ee:"+arg0+","+User.class.isAssignableFrom(arg0));
        return User.class.isAssignableFrom(arg0);
    }

    @Override
    public void validate(Object target, Errors errors) {
        //ValidationUtils.rejectIfEmpty(errors, "userName", "user.userName.required", "用户名不能为空");
        //ValidationUtils.rejectIfEmpty(errors, "password", "user.password.required", "密码不能为空");
        //ValidationUtils.rejectIfEmpty(errors, "email", "user.email.required", "邮箱不能为空");
        User user = (User) target;
        int length = user.getUserName().length();
        if (length > 20) {
            errors.rejectValue("userName", "user.userName.too_long", "用户名不能超过{20}个字符");
        }
        length = user.getPassword().length();
        if (length < 6) {
            errors.rejectValue("password", "user.password.too_short", "密码太短,不能少于{6}个字符");
        } else if (length > 20) {
            errors.rejectValue("password", "user.password.too_long", "密码太长,不能长于{20}个字符");
        }
        int index = user.getEmail().indexOf("@");
        if (index == -1) {
            errors.rejectValue("email", "user.email.invalid_email", "邮箱格式错误");
        }
    }
}
 

3、前端:thymeleaf

<html>
    <head>
    </head>
    <body>
        
        <br /><hr />
        
        <form action="#" th:action="@{/addUser}"  method="POST">
            userName :<input type="text" name="userName"  /><br />
            password :<input type="text" name="password" /><br />
            email :<input type="text" name="email" /><br />
            状态:<div style="font-size:18px;"><span th:text="${result}"></span></div>
            <input type="submit" />
        </form>
        
    </body>
</html>

4、后端controller

import java.util.List;
import java.util.function.Consumer;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;

import com.example.demo.app.model.User;
import com.example.demo.app.validate.UserValidate;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableListMultimap.Builder;

@Controller
public class UserController {
    
    @GetMapping("/userInfo")
    public ModelAndView userInfo() {
        ModelAndView userView = new ModelAndView("user");
        return userView;
    }

    
    @PostMapping("/addUser")
    public String addBook(@Validated User user,BindingResult result, Model model) {
        
        if(result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            Builder<String, String> builder = ImmutableListMultimap.builder();
            allErrors.stream().forEach(new Consumer<ObjectError>() {

                @Override
                public void accept(ObjectError t) {
                    builder.put(t.getObjectName(), t.getDefaultMessage());
                }
            });
            
            ImmutableListMultimap<String, String> build = builder.build();
            model.addAttribute("result",build);
        }else {
            model.addAttribute("result","success");
        }
        return "user";
    }
    
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(new UserValidate());
    }
    
}
5、前端提交后,报异常,异常的结果是ImmutableListMultimap类也进行了UserValidate的验证过程,请问为什么呢

加载中
0
2010带你飞
2010带你飞

其实基于JAVA bean的验证已经没意思了,hibernate已经有了,我也自己实现过自定义验证,建议你去研究一下基于map或者list<map>的数据验证比较好

2010带你飞
2010带你飞
大部分来了都是基于JAVA bean来验证的,但是假如controller里面用Map来接收参数该如何实现自动化验证呢?
B
B-Chen
hibernate 验证这个已经有知晓了。基于java bean的也是特意为之。你说的基于map或者list<map>是什么意思呢。没明白
返回顶部
顶部