Vaadin SuperDevMode重新编译有时会失败,Widget不会被渲染,并且Widget的Java代码不可用

时间:2015-02-15 19:07:42

标签: java gwt vaadin gwt-super-dev-mode

我正在尝试在Vaadin项目上设置SuperDevMode。

我基本上有3个与此功能相关的问题。

我有以下小部件(使用" New Vaadin Widget"向导创建,位于客户端小部件,连接器,状态和服务器端组件的代码下方):

// Widget:
public class CountedTextFieldWidget extends Composite {

    private TextBox textBox = new TextBox();
    private Label countLabel = new Label("0");
    private HorizontalPanel panel = new HorizontalPanel();

    public static final String CLASSNAME = "countedtextfield";

    public CountedTextFieldWidget() {
        initWidget(panel);
        setStylePrimaryName(CLASSNAME);
        textBox.setStylePrimaryName(CLASSNAME + "-field");
        countLabel.setStylePrimaryName(CLASSNAME + "-label");
        setStylePrimaryName(CLASSNAME);
        panel.add(textBox);
        panel.add(countLabel);
    }

    public String getText() {
        return textBox.getText();
    }

    public void setText(String text) {
        textBox.setText(text);
    }

    public void setCount(int count) {
        countLabel.setText("" + count);
    }

    public int getCount() {
        return Integer.parseInt(countLabel.getText());
    }

    // HandlerRegistration can be used to remove the key up handler (listener) 
    // added with this method
    public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) {
        return textBox.addKeyUpHandler(handler);
    }

}

/********************************************************/
// Connector:
@Connect(CountedTextField.class)
public class CountedTextFieldConnector extends AbstractComponentConnector {

    public CountedTextFieldConnector() {
        getWidget().addKeyUpHandler(new KeyUpHandler() {

            @Override
            public void onKeyUp(KeyUpEvent event) {
                String text = getWidget().getText();
                getWidget().setCount(text.length());
            }           
        });
    }

    @Override
    protected Widget createWidget() {
        return GWT.create(CountedTextFieldWidget.class);
    }

    @Override
    public CountedTextFieldWidget getWidget() {
        return (CountedTextFieldWidget) super.getWidget();
    }

    @Override
    public CountedTextFieldState getState() {
        return (CountedTextFieldState) super.getState();
    }

    @Override
    public void onStateChanged(StateChangeEvent stateChangeEvent) {
        super.onStateChanged(stateChangeEvent);

        final String text = getState().text;
        getWidget().setText(text);
        getWidget().setCount(text.length());
    }

}

/********************************************************/
// State

public class CountedTextFieldState extends com.vaadin.shared.ui.textfield.AbstractTextFieldState {

    {
        primaryStyleName = null;
    }
}

/********************************************************/
// Server-side component:
public class CountedTextField extends com.vaadin.ui.TextField {

    @Override
    public String getValue() {
        return getState().text;
    }

    public void setValue(String value) {
        getState().text = value;
    }

    @Override
    public CountedTextFieldState getState() {
        return (CountedTextFieldState) super.getState();
    }
}

此窗口小部件呈现如下:

enter image description here

现在,我已经按照以下关于Vaadin wiki的指南:

https://vaadin.com/wiki/-/wiki/Main/Using%20SuperDevMode

CodeServer按预期启动:

The code server is ready.
Next, visit: http://localhost:9876/

但是,当我打开项目并将?superdevmode附加到网址时,会收到Recompilation failed...消息,并且浏览器控制台中存在一些错误:

enter image description here

enter image description here

所以我的第一个问题与这个问题有关:

1)为什么重新编译有时会失败?那些SEVERE: JSONP compile call failedSEVERE: Timeout Excecution是什么?

然后,如果我... click to retry有时超级模式开始,但自定义小部件不会像我之前发布的屏幕截图那样呈现。 相反,我得到了一个标准的Vaadin的v-textfield ......

enter image description here

2)WTF ......为什么?我的自定义组件在哪里?

我注意到,如果我打开localhost:9876,我也会遇到同样的问题,将Dev Mode On按钮拖到书签工具栏上,然后在localhost:8080/project上点击它。我的自定义小部件消失了,而是我得到了Vaadin的v-textfield小部件......

关于Enable Source Map功能。在维基上,他们说:

  

要在Chrome中调试Java代码,请打开Chrome Inspector   (右键单击 - >检查元素),单击下方的设置图标   窗口的一角,检查"脚本 - >启用源地图"。   在检查器打开的情况下刷新页面,您将看到Java代码   而不是脚本选项卡中的JavaScript代码。

在我的Chrome中,我在窗口的下角没有设置图标,我点击右侧的齿轮图标,然后转到General -> Sources并选中Enable JavaScript Source Map(有& #39;我的设置标签上没有通用Enable source maps条目。

我可以看到Java源代码,但它们都是GWT和Vaadin组件的源代码:

enter image description here

所以我的第三个问题和相关问题:

3)如何查看我的自定义窗口小部件代码?

感谢您的关注!希望我很清楚。

1 个答案:

答案 0 :(得分:0)

我在使用VaDin的SuperDev模式时遇到了类似的问题。我不太确定为什么重新编译有时失败,但我怀疑它涉及我尝试发送我的Java源地图的同样问题。由于代码服务器在我的/ tmp文件夹中创建了持久性缓存目录,因此我遇到的问题似乎是缓存问题。所以我删除了它创建的每个文件夹(它们通常在名称中有#34; gwt&#34;)并重新启动代码服务器。我建议还在代码服务器配置中添加-src <complete-path-to-project>参数,以指定包含GWT源的目录,该目录将添加到类路径中以进行编译,并可能将日志级别更改为TRACEDEBUG。这是一个例子:

com.example.AppWidgetSet -src /home/workspace/widgetset/src/main/java 
-logLevel TRACE

我应该提到日志级别非常冗长,但可能非常有用。日志还应显示缓存文件夹的位置。