Spring Roo GWT с инъекцией джина на виджетах, созданных UI: Binder
-
08-10-2019 - |
Вопрос
Я пытаюсь получить доступ к некоторым объектам внутри пользовательского интерфейса: связующий компонент, но не уверен в том, как получить доступ к Eventbus, requestfactory, и т. Д., Без написания неприятного кода, который будет держать меня в бодрствовании ночью (также принять к сведению, что я совершенно нового Java, фон в Perl / python / php).
Мой файл ui.xml:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>
<ui:style>
...
</ui:style>
<g:HorizontalPanel>
...
</g:HorizontalPanel>
</ui:UiBinder>
Инъекция Eventbus в этом пути выходит из строя с com.ig.client.scaffold.ui.widget.r не имеет конструктора по умолчанию (Zero Args).
public class R extends Composite {
interface MyUiBinder extends UiBinder<Widget, R> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private final EventBus eventBus;
@UiField SimplePanel fieldA, ...;
@Inject
public R(EventBus eventBus){
this.eventBus = eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
}
Итак, согласно сообщению об ошибке, я создаю Uifactory, а затем я получаю ошибку ... '{Style.entityComponent}'> Отсутствует требуемый атрибут (ы): элемент eventbus ... (кажется, что он пытается найти EventBus в пользовательском интерфейсе: связующая таблица стилей.
public class R extends Composite {
interface MyUiBinder extends UiBinder<Widget, R> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private final EventBus eventBus;
@UiField SimplePanel fieldA, ...;
public @UiConstructor R(EventBus eventBus){
this.eventBus = eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
@Inject
@UiFactory R makeR(){
return new R(eventBus);
}
}
От чтения и чтения и читания на чтении за последние пару дней я не видел никого доступа к Eventbus, ShirectactFactory и HistoryController непосредственно в привязке представления с использованием UI: Binder Widget, который привел к выводу, что это, вероятно, не лучшая практика в любом случае.
Допустим, у меня есть ввод, давайте назовем его прокси, прокси содержит ручку, который затем вызывает eventbus.dosomething (). Как связать этот прокси-объект прокси к интерфейсу: Binder Widget без необходимости создавать его или без необходимости передавать его к каждому виджету?
Можно ли сделать инъекцию джина на интерфейсе, а затем реализовать этот интерфейс через класс R, который тогда каким-то образом будет содержать объекты, которые я ищу?
Любое решение, которое желает работать, просто ищет образец (что Java n00b может понять), что в основном позволит мне подключить мой интерфейс с остальными сервисами, созданными ROO.
Спасибо Дж
Решение
Проверьте Модель, вид, ведущий шаблон - Это решает эту проблему. Обычно вся неисправна логика должна быть вынуждена выходить из ваших представлений, так что 1) логика неисправности может быть тестирована единицами без запуска внутри (медленно в мгновенном) браузере и 2) разные дисплеи могут быть подключены к тому же приложению без дублирования неисправна логика.
Вот пример MVP, демонстрирующий поведение, которое вы ищете (обратите внимание, что стиль немного отличается от реализации деятельности и мест).
MyPresenter.java:
public class MyPresenter {
public interface Display extends IsWidget {
void setButtonClickHandler(ClickHandler buttonClickHandler);
}
private final Display display;
private final EventBus eventBus;
@Inject
public MyPresenter(EventBus eventBus,
Display display)
{
this.display = display;
this.eventBus = eventBus;
bind();
}
private void bind() {
display.setButtonClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
eventBus.fireEvent(new MyButtonClickedEvent());
}
});
}
public void go(HasWidgets container) {
container.add(display.asWidget());
}
}
Myview.ui.xml:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>
<g:Button ui:field="myButton"/>
</ui:UiBinder>
Myview.java
public class MyView extends Composite implements MyPresenter.Display {
interface MyViewUiBinder extends UiBinder<Widget, MyView> {}
private static MyViewUiBinder uiBinder = GWT.Create(MyViewUiBinder.class);
private ClickHandler buttonClickHandler = null;
public MyView() {
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("myButton")
void onButtonClick(ClickEvent event) {
if (buttonClickHandler != null) {
buttonClickHandler.onClick(event);
}
}
@Override
public void setButtonClickHandler(ClickHandler buttonClickHandler) {
this.buttonClickHandler = buttonClickHandler;
}
}
И в вашем модуле джина: bind(MyPresenter.Display.class).to(MyView.class);