【问题标题】:Bean Injection After DataTableDataTable 之后的 Bean 注入
【发布时间】:2011-02-08 01:30:13
【问题描述】:

我有一个包含从服务类读取数据的数据表的页面。假设该服务类被注入了一个contactDAO,但它不会立即被注入。事实上,当页面第一次加载时,数据表是空的,因为 DAO 还没有被注入。但是,如果我调用 addContact(),则“联系人”列表会更新得很好,因为此时会注入 contactDAO。

如何确保在数据表需要使用服务类之前注入contactDAO?我正在使用 Spring 3 和 JSF 2.0。

带有数据表的页面绑定到列表'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>

【问题讨论】:

    标签: spring jsf dependency-injection datatable lazy-initialization


    【解决方案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 项目)

    【讨论】:

    • 构造函数注入工作。如果我找到其他解决方案,我会发布。谢谢。
    猜你喜欢
    • 2014-06-10
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多