サービスクラスからデータを読み取るデータテーブルを持つページがあります。そのサービスクラスはcontactDAOを注入されると考えられていますが、すぐには注入されません。実際、ページが最初にロードされると、DAOがまだインジェクトされていないため、データテーブルは空になります。しかし、私がaddContact()を呼び出すと、contactDAOがそれまでに挿入されているので、リスト 'contacts'はうまく更新されます。DataTable後のBean注入
データテーブルにサービスクラスを使用する前に、contactDAOが確実に注入されるようにするにはどうすればよいですか?私はSpring 3とJSF 2.0を使用しています。
のDataTableとページがリストにバインドされた 'contactServiceImpl.contacts
':
<h:dataTable var="contact" value="#{contactServiceImpl.contacts}">
...
</h:dataTable>
マイ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>
コンストラクタインジェクションが機能しました。私は別の解決策を見つけたら投稿します。ありがとう。 – Steve