1

サービスクラスからデータを読み取るデータテーブルを持つページがあります。そのサービスクラスは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> 

答えて

1

春コンストラクタでプロパティを注入する前に必ずBeanを作成してください。注入されたpropeを使用することはできません彼らは注射する前にrties。あなたは、ロジックを書き換えるか、コンストラクタ引数としてcontactDAOを取得する必要があります。この問題を解決するために(アイム非常に醜いソリューションを知っているが、仕事)

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> 

はHigly(例えば、私は私のプロジェクトで使用Wicketのよ他のソリューションを検索お勧めしますテーブルをレンダリングするもう1つのコンセプトがあります。DataProviderを使用しているので、JSFプロジェクトでこのコンセプトを使用できるかもしれません)

+0

コンストラクタインジェクションが機能しました。私は別の解決策を見つけたら投稿します。ありがとう。 – Steve

関連する問題