2017-06-30 94 views
0

进出口新的春天开机后发现试图用一个类中的服务时的问题,我创建的验证表单的Autowire Spring不开机工作表单

我创建了一个验证类验证形式,在这里提到

https://spring.io/guides/gs/validating-form-input/

它将按预期

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; 
    } 
} 

的问题是即时得到HV000090:无法访问isUniqueEmailForUser。

当我侵入存储库是null.I已经使用userRepository系统中的其他地方autowire和它按预期工作。

主要包是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; 
    } 

感谢。

+1

你如何创建对象的代码?我想你试图验证控制器中的对象,但在这种情况下,该对象不是一个bean,但从请求创建。所以这个版本库不是自动装配的。 – StanislavL

+0

您好StanislavL问题更新与控制器中的代码,因为我的理解表单也注入here.I不知道底层behaviour.Hope这有助于清除问题。 –

回答

1

正如我在你的案例的评论中提到的,你在这里只有一个POJO实例而不是一个bean。所以这里没有豆子可以自动装配。

相反,您可以添加一个自定义约束并为注入的bean提供一个Validator。

@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; 

    ... 
} 

验证器得到了链接

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/validation.html#validation-beanvalidation-spring-constraints

+0

非常感谢 –