Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Autowire在Spring引导窗体中不工作_Spring_Validation_Spring Mvc_Spring Boot_Autowired - Fatal编程技术网

Autowire在Spring引导窗体中不工作

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.

我是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.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问题是用控制器中的代码更新的,因为我知道表单也在这里注入。我不确定底层行为。希望这有助于解决问题。非常感谢