我有一个名为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
答案 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 ...