代码之家  ›  专栏  ›  技术社区  ›  tonix

ServerRpc无法在自定义Vaadin Widgetset中工作,为什么我会得到“Widgetset‘…‘不包含‘…‘的实现?”?

  •  0
  • tonix  · 技术社区  · 11 年前

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

    以下是课程:

    小工具包.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;
    
        } 
    
    
    
    
    }
    

    小工具包。小工具:

    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.MarqeLabelWidget:

    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.MarkleLabelConnector(小部件包客户端标记标签连接器):

    @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);
    
            }
    
    
    
        }
    

    WidgetWidgetset.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>
    

    当我构建小部件集和“在服务器上运行”时,一切都正常,但当我添加这个ServerRpc实现时,如下所示:

    1) 添加widgetpackage.MarqueeLabelServerRpc接口(widgetpackage,MarqueeLabel服务器组件所在的位置):

     public interface MarqueeLabelServerRpc extends ServerRpc {
    
          public void clicked();
    
        }
    

    2) 将此行添加到widgetpackage.client.MarkeLabelConnect:

    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“widgetpackage.widgetWidgetset”不包含 “widgetpackage.MarkeLabel”的实现。检查其组件 连接器的@Connect映射、小部件集GWT模块描述文件 并重新编译小部件集。如果你下载了vaadin 附加组件包,您可能需要参考附加组件说明。

    为什么当我添加RPC实现时,小部件集再也找不到MarqueeLabel的实现了?

    1 回复  |  直到 11 年前
        1
  •  0
  •   tonix    11 年前

    我已经解决了,问题是MarqueLabelServerRpc需要位于widgetpackage.client包中,而不是widgetpackage中。

    推荐文章