Validation 在spring boot中存在关于验证器的问题
我在SpringBoot中开发项目,并使用validator验证用户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
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