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}"/>