Autowire在Spring引导窗体中不工作
我是spring boot新手,在尝试在我创建的用于验证表单的类中使用服务时发现了一个问题 我创建了一个validator类来验证表单,正如这里提到的 它按预期工作Autowire在Spring引导窗体中不工作,spring,validation,spring-mvc,spring-boot,autowired,Spring,Validation,Spring Mvc,Spring Boot,Autowired,我是spring boot新手,在尝试在我创建的用于验证表单的类中使用服务时发现了一个问题 我创建了一个validator类来验证表单,正如这里提到的 它按预期工作 package com.nexill.bank.form.user; import com.nexill.bank.entity.User; import com.nexill.bank.repository.UserRepository; import org.hibernate.validator.constraints.
package com.nexill.bank.form.user;
import com.nexill.bank.entity.User;
import com.nexill.bank.repository.UserRepository;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.stereotype.Component;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Size;
@Component
@Configurable
public class UserForm {
@Autowired
UserRepository userRepository;
@Email(message = "Must be a valid email")
@NotEmpty(message = "Email cannot be empty")
private String email;
@NotEmpty(message = "Password cannot be empty")
@Size(min=6, max=30, message = "Password need to be between 6 to 30 characters")
private String password;
@NotEmpty(message = "Confirm password cannot be empty")
@Size(min=6, max=30, message = "Confirm password need to be between 6 to 30 characters")
private String confirmPassword;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getConfirmPassword() {
return confirmPassword;
}
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
@AssertTrue(message = "Password and confirm password need to match")
public boolean isDifferentPass() {
return !password.equals(confirmPassword) ? false : true;
}
@AssertTrue(message = "Email already exists")
public boolean isUniqueEmailForUser() {
User x = userRepository.findUserByEmail(getEmail());
return (x) == null;
}
}
问题是im获取HV000090:无法访问isUniqueEmailForUser
当我入侵时,存储库为空。我在系统中的其他地方使用了userRepository和autowire,它按预期工作
主程序包是package com.nexill.bank。我缺少什么
表单在控制器中的使用方式如下
@RequestMapping(value = "/adminDashboard/user", method= RequestMethod.POST)
public ModelAndView adminDashboardAddUserPost(ModelAndView modelAndView, @Valid UserForm userForm, BindingResult bindingResult) {
modelAndView.addObject("currentUser", authenticationFacade.getUser());
modelAndView.addObject("userForm", userForm);
if (!bindingResult.hasErrors()) {
User user = new User(userForm);
user.setRole(roleService.getRepository().findByName("BANK_STAFF"));
userService.createUser(user);
ModelAndView redirectModelAndView = new ModelAndView("redirect:/adminDashboard");
redirectModelAndView.addObject("saveStatus" , true);
return redirectModelAndView;
}
modelAndView.setViewName("adminDashboard/user");
return modelAndView;
}
提前感谢。正如我在您案例的评论中提到的,这里只有一个POJO实例,而不是一个bean。所以这里没有自动连线的豆子 相反,您可以添加一个自定义约束,并提供一个带有注入bean的验证器
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
您可以在其中注入bean的验证器
import javax.validation.ConstraintValidator;
public class MyConstraintValidator implements ConstraintValidator {
@Autowired;
private UserRepository userRepository;
...
}
从链接中获取代码
如何创建对象?我猜您正在尝试验证控制器中的对象,但在本例中,该对象不是bean,而是根据请求创建的。所以存储库不是自动连线的。嗨,StanislavL问题是用控制器中的代码更新的,因为我知道表单也在这里注入。我不确定底层行为。希望这有助于解决问题。非常感谢