Инъекция бина после таблицы данных - PullRequest
1 голос
/ 08 февраля 2011

У меня есть страница с таблицей данных, которая считывает данные из класса обслуживания.Предполагается, что этот класс обслуживания вводится с помощью 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>

1 Ответ

1 голос
/ 08 февраля 2011

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...