Tapestry5 с использованием услуг внутри расширенных классов.
Я пользователь tapestry5 с вопросом об использовании услуг внутри расширенных классов. Допустим, у меня есть следующая структура класса,
BaseClass
public class BaseClassImpl extends ExtendedOneClass implements BaseClass {
@Inject
private ServiceOne serviceOne;
}
ExtendedOneClass
public class ExtendedOneClass extends ExtendedTwoClass {
@Inject
private ServiceTwo serviceTwo;
}
ExtendedTwoClass
public class ExtendedTwoClas {
@Inject
private ServiceThree serviceThree;
}
Что мне нужно сделать, чтобы иметь возможность пользоваться услугами внутри расширенного класса?
Я настраиваю свой AppModule так
public static void bind(ServiceBinder binder) {
binder.bind(BaseClass.class, BaseClassImpl.class);
binder.bind(ExtendedOneClass.class);
binder.bind(ExtendedTwoClass.class);
}
Но я не могу заставить службы работать внутри расширенного класса. Я предполагаю, что это потому, что расширенный класс не был создан с помощью @Inject гобелена. Итак, вопрос в том, как вы решаете эту задачу?
1 ответ
Используйте внедрение конструктора и передайте сервисы родительскому конструктору:
public class BaseClassImpl extends ExtendedOneClass implements BaseClass
{
private HibernateSessionSource hibernateSessionSource;
public BaseClassImpl(SystemEnvironment systemEnvironment, LinkSource linkSource,
HibernateSessionSource hibernateSessionSource)
{
super(systemEnvironment, linkSource);
}
}
В любом случае ваша установка не будет работать, вам нужно добавить идентификаторы сервисов в этой настройке, потому что в противном случае у вас будет несколько сервисов, реализующих один и тот же интерфейс. Это должно помочь:
binder.bind(ExtendedOneClass.class).withId("ext1");
В сочетании с этим:
@InjectService("ext1")
private ExtendedOneClass extendedOneClass;