自动装配的注入变量为空

Autowired injected variable is null

我有一个名为 UniqueEmailValidatorFacesValidator class 来确定输入的电子邮件是否唯一。

我需要 userService 变量,所以我通过 spring 注入它。

这里是 UniqueEmailValidator.java :

@FacesValidator("com.obs.bean.uniqueEmailValidator")
@Component
public class UniqueEmailValidator implements Validator {

    @Autowired
    private UserService userService;

    public void validate(FacesContext fc, UIComponent uic, Object value) throws ValidatorException {
        if (value == null) {
            return;
        }
        String email = (String) value;
        System.out.println("userService before use: " + userService); // null
        boolean exists = userService.emailExists(email);
        if (exists) {
            throw new ValidatorException(new FacesMessage(
                    FacesMessage.SEVERITY_ERROR, "Email already in use", null));
        }
    }
}

这里是 UserServiceImple.java:

@Service
public class UserServiceImpl implements UserService<User, Integer>, Serializable {

@Autowired
@Qualifier("userDao")
private UserDao userDao;

@Transactional()
public boolean emailExists(String value) {
    Query query = userDao.getSession().createQuery("from User where email=?");
    query.setString(0, value);
    if (query.uniqueResult() != null) {
        return true;
    }
    return false;
  }
}

但是 userServicenull,(我得到 nullPointerException

我在applicationContext.xml中也有这行:

<!-- Activates scanning of @Autowired -->
<context:annotation-config/>

<!-- Activates scanning of @Repository and @Service -->
<context:component-scan base-package="..."/>

您可以尝试为您的自动装配服务使用参数化声明

@Autowired
private UserService<User, Integer> userService;

或者尝试使用@Qualifier 并为您的服务命名

@Service("myService")
public class UserServiceImpl ...

...

@Autowired
@Qualifier("myService")
private UserService<User, Integer> userService;

当您使用标签启用验证器时

<f:validator validatorId="validatorId"/>

然后验证器实例由 JSF 实现创建(通过获取 Class 并仅调用 newInstance()),因此它不被识别为 Spring bean 并且自动装配不起作用.要将验证器实例作为 Spring bean,您必须使用绑定属性:

<f:validator binding="#{validatorBeanName}"/>

在这种情况下,注释 @FacesValidator 不是必需的。