GWT JsInterop:JsType属性,带有-&引用;名义上

GWT JsInterop:JsType属性,带有-&引用;名义上,gwt,Gwt,我想包装Javascript对象 {"Ctrl-Space": "autocomplete"} 到GWT。 当我尝试时: @JsType public class ExtraKeyType { @JsProperty(name = "Ctrl-Space") public String ctrlSpace = "autocomplete"; } 我得到了错误 字符串ExtraKeyType.ctrlSpace“”具有无效的名称“Ctrl空格” 可以用JsInterop来包装它

我想包装Javascript对象

{"Ctrl-Space": "autocomplete"}
到GWT。 当我尝试时:

@JsType
public class ExtraKeyType {
    @JsProperty(name = "Ctrl-Space")
    public String ctrlSpace = "autocomplete";
}
我得到了错误

字符串ExtraKeyType.ctrlSpace“”具有无效的名称“Ctrl空格”


可以用JsInterop来包装它吗?

这是不可能的,但这是故意的。它受到这个强制使用有效JS标识符的正则表达式的限制

您应该注意,这是非法的{带破折号:“坏”},因为破折号对于标识符无效。但这是合法的{带下划线:“right”},它在JsInterop中正常工作。但是,JS很棘手,它实际上支持无效的标识符,只需要被引用,这样您就可以编写{“with dash”:“right too”}

所以,看起来您要求的是改进JsInterop,以支持本机类型属性中的无效标识符。我认为这还不受支持,因为例如,无效标识符不能与点表示法一起使用,因此生成的JS代码将与无效标识符不同。但是,如果您想将JSON映射到Java类型,这看起来是一个有趣的(几乎是必需的)特性


这是您的下一步:

您不能使用简单的
@JsProperty
注释来执行此操作

解决方法是使用
jsinterop base
库、class
Js
JsPropertyMap
,如下所示:

import jsinterop.annotations.JsOverlay;
import jsinterop.base.Js;

@JsType
public class ExtraKeyType {
    //@JsProperty(name = "Ctrl-Space")
    //public String ctrlSpace = "autocomplete";

    @JsOverlay
    public final void setCtrlSpace(String value) {
        Js.asPropertyMap(this).set("Ctrl-Space", value);
    }

    @JsOverlay
    public final String getCtrlSpace() {
        return Js.asPropertyMap(this).getAny("Ctrl-Space").asString();
    }

}

你找到解决办法了吗?我也被同样的问题困扰着……不,我没有找到解决办法,对不起。