【发布时间】:2015-07-19 22:29:02
【问题描述】:
我有一个名为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));
}
}
}
这里是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;
}
}
但是userService 是null,(我得到nullPointerException)
我在applicationContext.xml也有这行:
<!-- Activates scanning of @Autowired -->
<context:annotation-config/>
<!-- Activates scanning of @Repository and @Service -->
<context:component-scan base-package="..."/>
【问题讨论】:
-
看起来 JSF 正在管理
UniqueEmailValidator的实例而不是 Spring,因此您无法注入任何对象。 -
@LuiggiMendoza 那么有什么解决办法吗?
-
我不会在这种情况下使用验证器,就这么简单。
-
对于这种特殊情况,我会在数据库中设置一个唯一键,尝试插入并处理未满足唯一键约束的异常。如果您仍然希望/需要向用户显示一条好消息以进行验证,那么我建议您在
action中处理此验证。这不是正确的方法,但您可以为这种情况做些什么。另外,我会向 JSF 人员提交一张票,以添加对在验证器和转换器上注入 CDI/Spring/Guice bean 的支持。 -
顺便说一下,mkyong 有这个:mkyong.com/jsf2/spring-autowired-into-jsf-custom-validator