Spring 自动连线注入变量为空

Spring 自动连线注入变量为空,spring,jsf,autowired,Spring,Jsf,Autowired,我有一个名为UniqueEmailValidator的FacesValidator类来确定输入的电子邮件是否唯一 我需要userService变量,所以我通过spring注入它 下面是UniqueEmailValidator.java: @FacesValidator("com.obs.bean.uniqueEmailValidator") @Component public class UniqueEmailValidator implements Validator { @Auto

我有一个名为
UniqueEmailValidator
FacesValidator
类来确定输入的电子邮件是否唯一

我需要
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));
        }
    }
}
以下是
用户服务imple.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;
  }
}

您可以尝试为自动连线服务使用参数化声明

@Autowired
private UserService<User, Integer> userService;

@Autowired
@限定符(“myService”)
私人用户服务;

当您使用标签启用验证程序时

<f:validator validatorId="validatorId"/>

然后,验证程序实例由JSF实现创建(通过获取类并只调用newInstance()),因此它不会被识别为Springbean,自动连接也不起作用。要将验证器实例获取为Springbean,必须使用binding属性:

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


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

看起来JSF是在管理
UniqueMailValidator
的实例,而不是Spring,因此您不能注入任何对象。@Luigimendoza有什么解决方案吗?我不会在这种情况下使用验证器,就这么简单。对于这个特定的情况,我会在数据库中设置一个唯一键,尝试插入并处理未满足唯一键约束的异常。如果您仍然希望/需要向用户显示一条好消息以进行验证,那么我建议在
操作中处理此验证。这不是正确的方法,但这是您可以为本案例所做的。另外,我将向JSF人员提交一份票据,以添加对在验证器和转换器上注入CDI/Spring/Guice bean的支持
@Autowired
@Qualifier("myService")
private UserService<User, Integer> userService;
<f:validator validatorId="validatorId"/>
<f:validator binding="#{validatorBeanName}"/>