Validation 在spring boot中存在关于验证器的问题

Validation 在spring boot中存在关于验证器的问题,validation,spring-boot,Validation,Spring Boot,我在SpringBoot中开发项目,并使用validator验证用户 import java.io.IOException; import java.util.Map; import java.util.Properties; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import org.sl

我在SpringBoot中开发项目,并使用validator验证用户

    import java.io.IOException;
import java.util.Map;
import java.util.Properties;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
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.RestController;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.newDemo.common.service.ResourceProperties;
import com.newDemo.constants.Constant;
import com.newDemo.modules.user.domain.AuthenticationToken;
import com.newDemo.modules.user.domain.User;
import com.newDemo.modules.user.service.AuthenticationTokenService;
import com.newDemo.modules.user.service.SocialAuthService;
import com.newDemo.modules.user.service.UserService;
import com.newDemo.modules.user.validator.UserValidator;
import com.newDemo.utils.ResponseHandlerUtil;

@RestController
@RequestMapping("/api/v1/user")
public class UserController {

    public static Logger log = LoggerFactory.getLogger(UserController.class);
    @Autowired UserService userService;
    @Autowired AuthenticationTokenService authenticationTokenService;
    @Autowired SocialAuthService socialAuthService;
    @Autowired ResourceProperties resourceProperties;
    private Properties configProp;

    /**
     * load message property file
     * @throws IOException
     */
    @PostConstruct
    public void init() throws IOException{
        configProp = resourceProperties.getResourceProperties(Constant.RESPONSE_MSG_FILE_PATH);
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new UserValidator());
    }

    /**
     * this method used to create new user or update user
     * @author oodles
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public Map<String, Object> addUser(@Valid @RequestBody User user) {
        log.debug("adding new user");
        return ResponseHandlerUtil.generateResponse(
                configProp.getProperty("user.created"), HttpStatus.ACCEPTED,
                true, userService.addUser(user));
    }
}
在该控制器中给出异常的第二种方法是

 @RequestMapping(value = "/sociallogin", method = RequestMethod.POST)
        public Map<String, Object> login(@RequestBody Map map,HttpServletResponse resp) throws IOException{
                Map<String, Object> data = null;
                final ObjectMapper mapper = new ObjectMapper();
User user = (User)mapper.readValue(mapper.writeValueAsString(map.get("userdetails")), User.class);
                data = socialAuthService.login((String) map.get("social_auth_token"), (String) map.get("login_type"), user);
            return ResponseHandlerUtil.generateResponse(configProp.getProperty("login.success"),HttpStatus.ACCEPTED, true, data);
        }
@RequestMapping(value=“/socialwin”,method=RequestMethod.POST)
公共映射登录(@RequestBody-Map-Map,HttpServletResponse-resp)引发IOException{
地图数据=空;
最终ObjectMapper映射器=新ObjectMapper();
User User=(User)mapper.readValue(mapper.writeValueAsString(map.get(“userdetails”)),User.class);
data=socialAuthService.login((String)map.get(“social\u auth\u token”),(String)map.get(“login\u type”),user);
返回ResponseHandlerUtil.generateResponse(configProp.getProperty(“login.success”)、HttpStatus.ACCEPTED、true、data);
}
我不希望对第二个方法进行验证,但当我对第二个方法进行命中时,它会给出上面指定的异常。 我的第二个问题是,如果将来我想在第二种方法中使用validator验证超过用户(使用对象映射器从映射中获取用户),那么该如何做呢

我的验证器类如下

package com.newDemo.modules.user.validator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.newDemo.modules.user.domain.User;

public class UserValidator implements Validator{

    public static Logger log = LoggerFactory.getLogger(UserValidator.class);
    @Override
    public boolean supports(Class<?> clazz) {
        // TODO Auto-generated method stub
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors err) {
        // TODO Auto-generated method stub
        log.debug("validating user");
        ValidationUtils.rejectIfEmptyOrWhitespace(err, "email", "email.empty");
        ValidationUtils.rejectIfEmptyOrWhitespace(err, "username", "username.empty");
        ValidationUtils.rejectIfEmptyOrWhitespace(err, "password", "password.empty");
        ValidationUtils.rejectIfEmptyOrWhitespace(err, "firstName", "firstName.empty");
        ValidationUtils.rejectIfEmptyOrWhitespace(err, "gender", "gender.empty");
    }

}
package com.newDemo.modules.user.validator;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.validation.Errors;
导入org.springframework.validation.ValidationUtils;
导入org.springframework.validation.Validator;
导入com.newDemo.modules.user.domain.user;
公共类UserValidator实现验证器{
公共静态记录器log=LoggerFactory.getLogger(UserValidator.class);
@凌驾
公共布尔支持(类clazz){
//TODO自动生成的方法存根
返回User.class.equals(clazz);
}
@凌驾
公共无效验证(对象目标,错误错误){
//TODO自动生成的方法存根
调试(“验证用户”);
ValidationUtils.rejectIfEmptyOrWhitespace(err,“email”,“email.empty”);
ValidationUtils.rejectIfEmptyOrWhitespace(err,“username”,“username.empty”);
ValidationUtils.rejectIfEmptyOrWhitespace(err,“password”,“password.empty”);
ValidationUtils.rejectIfEmptyOrWhitespace(err,“firstName”,“firstName.empty”);
ValidationUtils.rejectIfEmptyOrWhitespace(err,“gender”,“gender.empty”);
}
}

您需要将一个参数传递给
@InitBinder
,并在
@modeldattribute
中使用该参数?在一个项目中,我在同一个控制器中使用了多个验证器,如下所示。但这并没有使用
@RequestBody

@InitBinder("signupForm")
protected void initSignupBinder(WebDataBinder binder) {
    binder.setValidator(signupFormValidator);
}

@InitBinder("forgotPasswordForm")
protected void initForgotPasswordBinder(WebDataBinder binder) {
    binder.setValidator(forgotPasswordFormValidator);
}

@InitBinder("resetPasswordForm")
protected void initResetPasswordBinder(WebDataBinder binder) {
    binder.setValidator(resetPasswordFormValidator);
}

@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String signup(@ModelAttribute("signupForm") @Valid SignupForm signupForm,
        BindingResult result, RedirectAttributes redirectAttributes) {

... more methods

如果答案有问题,请告诉我我也有同样的错误。
@InitBinder("signupForm")
protected void initSignupBinder(WebDataBinder binder) {
    binder.setValidator(signupFormValidator);
}

@InitBinder("forgotPasswordForm")
protected void initForgotPasswordBinder(WebDataBinder binder) {
    binder.setValidator(forgotPasswordFormValidator);
}

@InitBinder("resetPasswordForm")
protected void initResetPasswordBinder(WebDataBinder binder) {
    binder.setValidator(resetPasswordFormValidator);
}

@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String signup(@ModelAttribute("signupForm") @Valid SignupForm signupForm,
        BindingResult result, RedirectAttributes redirectAttributes) {

... more methods