SpringRooGWT在ui:binder创建的小部件上使用GIN注入

SpringRooGWT在ui:binder创建的小部件上使用GIN注入,gwt,spring-roo,uibinder,gwt-gin,Gwt,Spring Roo,Uibinder,Gwt Gin,我试图访问ui:binder组件中的一些对象,但不确定如何访问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='ur

我试图访问ui:binder组件中的一些对象,但不确定如何访问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没有默认(零参数)构造函数

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));
    }
}
public类R扩展了复合{
接口MyUiBinder扩展了UiBinder{}
私有静态MyUiBinder=GWT.create(MyUiBinder.class);
专用最终事件总线事件总线;
@UiField SimplePanel fieldA。。。;
@注入
公共R(事件总线事件总线){
this.eventBus=eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
}
因此,根据错误消息,我创建了一个UIFactory,然后得到一个错误 ... '{style.entityComponent}'>缺少必需的属性:eventBus元素。。。(似乎它正在试图在ui:binder样式表中找到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);
    }
}
public类R扩展了复合{
接口MyUiBinder扩展了UiBinder{}
私有静态MyUiBinder=GWT.create(MyUiBinder.class);
专用最终事件总线事件总线;
@UiField SimplePanel fieldA。。。;
public@uir(EventBus EventBus){
this.eventBus=eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
@注入
@UIR制造商(){
返回新的R(eventBus);
}
}
在过去几天的阅读中,我没有看到任何人在绑定到ui:binder小部件的视图中直接访问eventBus、requestFactory和historyController,这导致了一个结论,即这可能不是最佳实践 无论如何

假设我有一个项目,我们称之为代理,代理包含handleButtonClick,然后调用eventBus.doSomething()。如何将这个代理对象链接到ui:binder小部件,而不必实例化它或将它传递给每个小部件

是否可以在接口上进行GIN注入,然后通过类R实现该接口,该类将以某种方式包含我正在寻找的对象

任何可行的解决方案都是受欢迎的,只要寻找一个示例(JavaN00B可以理解),它基本上允许我将前端与ROO创建的其余服务连接起来

谢谢 J

查看-它解决了 这个问题。通常所有非显示逻辑都应该被排除在外 使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;
  }
}
公共类MyView扩展复合实现MyPresenter.Display{
接口MyViewUiBinder扩展UiBinder{}
私有静态MyViewUiBinder=GWT.Create(MyViewUiBinder.class);
私有ClickHandler按钮ClickHandler=null;
公共MyView(){
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler(“myButton”)
作废按钮单击(单击事件){
if(buttonClickHandler!=null){
按钮ClickHandler.onClick(事件);
}
}
@凌驾
公共无效设置按钮ClickHandler(ClickHandler按钮ClickHandler){
this.buttonClickHandler=buttonClickHandler;
}
}

在您的GIN模块中:
bind(MyPresenter.Display.class).to(MyView.class)

谢谢Jason,我今天早上读了Google code的MVP文档,它似乎正是我想要的,将在今晚晚些时候实现。万分感谢:-)嗨,杰森,我没有让你的例子发挥作用,你有我可用的源代码吗?或者你介意看看我的代码并指出问题所在吗?我无法让绑定正常工作,并且已经挣扎了好几个星期。为什么你不针对你遇到的问题提出一个新问题,并从这里的评论链接到它,这样我就可以看到它了?嗨,Jason,GWT邮件列表上的某个人帮我解决了这个问题,谢谢你为我指明了正确的方向。