自动注入的变量为空

时间:2015-05-08 21:55:42

标签: spring jsf autowired

我有一个名为FacesValidator的{​​{1}}类来确定输入的电子邮件是否唯一。

我需要UniqueEmailValidator变量,所以我在春天注入它。

以下是userService

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

2 个答案:

答案 0 :(得分:2)

使用标记

启用验证程序时
<f:validator validatorId="validatorId"/>

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

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

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

答案 1 :(得分:0)

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

<?php

if(isset($_POST['my_input'])){
   echo $_POST['my_input'] ;
}

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

@Autowired
private UserService<User, Integer> userService;

...

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