我有一个带有数据表的页面,该数据表从服务类中读取数据。该服务类假设注入了contactDA,但它不会立即注入。实际上,当页面首次加载时,数据表为空,因为尚未注入DAO。但是,如果我调用addContact(),列表'contacts'会更新,因为那时会注入contactDAO。
在数据表需要使用服务类之前,如何确保注入contactDAO?我使用的是Spring 3和JSF 2.0。
包含数据表的页面绑定到列表“contactServiceImpl.contacts
”:
<h:dataTable var="contact" value="#{contactServiceImpl.contacts}">
...
</h:dataTable>
My ContactServiceImpl如下所示:
@Service
public class ContactServiceImpl implements ContactService {
private static List<Contact> contacts = new ArrayList<Contact>();
@Autowired
private static ContactDAO contactDAO;
private ContactServiceImpl() {
contacts = new ArrayList<Contact>();
//TODO: need to inject contactDAO at the same time as instantiation
contacts.clear();
try {
contacts.addAll( contactDAO.getContacts() );
} catch (Exception e) {
e.printStackTrace();
}
}
public void addContact(Contact contact) {
contacts.add(contact);
contactDAO.addContact(contact);
contacts.clear();
contacts.addAll( contactDAO.getContacts() );
}
@Autowired
public void setContactDAO(ContactDAO contactDAO) {
ContactServiceImpl.contactDAO = contactDAO;
System.out.println("DAO is injected");
}
}
和applicationContext.xml
<bean id="contactServiceImpl" class="com.example.service.ContactServiceImpl"
scope="session">
<property name="contactDAO" ref="contactDAOImpl"/>
</bean>
答案 0 :(得分:1)
Spring在使用构造函数注入属性之前总是创建bean,因此在注入之前不能使用注入属性。要解决这个问题,你必须重写逻辑或获取contactDAO作为构造函数arg(我知道非常难看的解决方案,但是工作)
private ContactServiceImpl(ContactDAO costrContactDAO) {
contacts = new ArrayList<Contact>();
//TODO: need to inject contactDAO at the same time as instantiation
contacts.clear();
try {
contacts.addAll( costrContactDAO.getContacts() );
} catch (Exception e) {
e.printStackTrace();
}
}
<bean id="contactServiceImpl" class="com.example.service.ContactServiceImpl"
scope="session">
<constructor-arg ref="contactDAOImpl"/>
<property name="contactDAO" ref="contactDAOImpl"/>
</bean>
高度推荐搜索其他解决方案(例如,我在我的项目中使用Wicket,还有另一个渲染表的概念 - 使用DataProviders所以我没有这样的问题,可能你可以使用这个概念你的JSF项目)