Gwt ServerRpc不在自定义Vaadin Widgetset中工作,为什么我会得到";Widgetset'';不包含';的实现';?

Gwt ServerRpc不在自定义Vaadin Widgetset中工作,为什么我会得到";Widgetset'';不包含';的实现';?,gwt,widget,vaadin,rpc,Gwt,Widget,Vaadin,Rpc,我对Vaadin中的ServerRpc实现有一个问题,我在eclipse中有一个带有widgetset的简单示例项目: 以下是课程: widgetpackage.MarqueeLabel: public class MarqueeLabel extends AbstractComponent { /** * */ private static final long serialVersionUID = 1L; @Override public Marq

我对Vaadin中的ServerRpc实现有一个问题,我在eclipse中有一个带有widgetset的简单示例项目:

以下是课程:

widgetpackage.MarqueeLabel:

public class MarqueeLabel extends AbstractComponent {




/**

     * 

     */

private static final long serialVersionUID = 1L;



@Override

public MarqueeLabelState getState() {

       return (MarqueeLabelState) super.getState();

    }



@Override

public void setCaption(String caption) {

       getState().text = caption;

    } 




}
widgetpackage.WidgetUI:

public class WidgetUI extends UI {




@WebServlet(value = "/*", asyncSupported = true)

@VaadinServletConfiguration(productionMode = false, ui = WidgetUI.class, widgetset = "widgetpackage.widgetWidgetset")

public static class Servlet extends VaadinServlet {

    }




@Override

protected void init(VaadinRequest request) {

        final VerticalLayout layout = new VerticalLayout();

        layout.setMargin(true);

        setContent(layout);




        MarqueeLabel label = new MarqueeLabel();

        label.setCaption("Hello I am custom widget!");



        layout.addComponent(label);

    }




}
widgetpackage.client.MarqeeLabelWidget:

public class MarqueeLabelWidget extends Label {




    public MarqueeLabelWidget() {

            final Element el = getElement();

            el.getStyle().setPosition(Position.RELATIVE);



            Timer timer = new Timer() {

                private int left = 0;



                @Override

                public void run() {

                    el.getStyle().setLeft(left, Unit.PX);

                    left++;

                }

            };

            timer.scheduleRepeating(100);

        }



    }

widgetpackage.client.MarqueeLabelState: 

public class MarqueeLabelState extends AbstractComponentState {




/**

     * 

     */

private static final long serialVersionUID = 1L;




public String text;



}
widgetpackage.client.MarqueLabelConnector:

@Connect(MarqueeLabel.class)

public class MarqueeLabelConnector extends AbstractComponentConnector {




/**

     * 

     */

private static final long serialVersionUID = 1L;




@Override

public Widget createWidget() {

        return GWT.create(MarqueeLabelWidget.class);

    }



@Override

public MarqueeLabelWidget getWidget() {

        return (MarqueeLabelWidget) super.getWidget();

    }



@Override

public MarqueeLabelState getState() {

        return (MarqueeLabelState) super.getState();

    }



    @Override

    public void onStateChanged(StateChangeEvent e) {

            super.onStateChanged(e);

            getWidget().setText(getState().text);

        }



    }
public class MarqueeLabelConnector extends AbstractComponentConnector {

  private MarqueeLabelServerRpc rpc = RpcProxy.create(
      MarqueeLabelServerRpc.class, this);

  public MarqueeLabelConnector() {
    getWidget().addClickHandler(new ClickHandler() {
      @Override
      public void onClick(ClickEvent event) {
        rpc.clicked(); // server's call
      }
    });
  }

  // ...

}
WidgetWidgeSet.gwt.xml位于widgetpackage包中:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd">

<module>

    <inherits name="com.vaadin.DefaultWidgetSet" />

</module>
2) 将以下行添加到widgetpackage.client.MarqueLabelConnector:

@Connect(MarqueeLabel.class)

public class MarqueeLabelConnector extends AbstractComponentConnector {




/**

     * 

     */

private static final long serialVersionUID = 1L;




@Override

public Widget createWidget() {

        return GWT.create(MarqueeLabelWidget.class);

    }



@Override

public MarqueeLabelWidget getWidget() {

        return (MarqueeLabelWidget) super.getWidget();

    }



@Override

public MarqueeLabelState getState() {

        return (MarqueeLabelState) super.getState();

    }



    @Override

    public void onStateChanged(StateChangeEvent e) {

            super.onStateChanged(e);

            getWidget().setText(getState().text);

        }



    }
public class MarqueeLabelConnector extends AbstractComponentConnector {

  private MarqueeLabelServerRpc rpc = RpcProxy.create(
      MarqueeLabelServerRpc.class, this);

  public MarqueeLabelConnector() {
    getWidget().addClickHandler(new ClickHandler() {
      @Override
      public void onClick(ClickEvent event) {
        rpc.clicked(); // server's call
      }
    });
  }

  // ...

}
3) 将此构造函数添加到widgetpackage.MarqueeLabel: 公共类MarqueeLabel扩展了AbstractComponent{

  public MarqueeLabel() {
    registerRpc(new MarqueeLabelServerRpc() {
      @Override
      public void clicked() {
        Notification.show("Made a RPC”); 
      }
    });
  }

  // ...

}
如果我重新编译widgetset并运行该项目,我会在浏览器中看到:

Widgetset“widgetpackage.widgetWidgetset”不包含 “widgetpackage.MarqueeLabel”的实现。请检查其组件 连接器的@Connect映射,widgetsets GWT模块描述文件 重新编译你的widgetset。如果你下载了一个vaadin 外接程序包,您可能需要参考外接程序说明


为什么我添加RPC实现时,widgetset再也找不到MarqueeLabel的实现了?

我已经解决了,问题是MarqueeLabelServerRpc需要在widgetpackage.client包中,而不是在widgetpackage中