GWT:在服务器端获取常量

5
我正在尝试在服务器端获取存储在客户端的常量(ConstantsWithLookup),但我不知道如何做。我的常量接口和常量属性位于同一个文件夹中。
我尝试了其他类似线程的提示,但都没有成功。
我尝试使用Hermes、gwt-i18n-server、gwt-dmesg、GTWI18N、ResourceBundle来获取源文件属性。对于前两个,似乎主要原因是对最新GWT版本的支持已经过时。至于ResourceBundle,则无法找到属性文件,因为在部署时,只有Constants.class文件而没有属性文件。
我正在尝试避免将我的属性文件更改为另一个位置(例如/WEB-INF/constants)。
1个回答

9

我正在使用GWT 2.5.0.rc1和Hermes,它能够良好地工作。使用方法:

  • 将hermes-1.2.0.jar放入war/WEB-INF/lib中
  • 然后在服务器端编写如下内容:
MyConstantsWithLookup my = Hermes.get(MyConstantsWithLookup.class, "de");
String string = my.getString(key);
  • MyConstantsWithLookup.properties属性文件必须MyConstantsWithLookup.java位于同一包中,即使该属性文件是空的(如果您使用@DefaultStringValue等情况可能会发生)。
  • 还要添加MyConstantsWithLookup_de.properties等。
  • 确保编译时将这些属性文件复制到类旁边。Javac不会这样做,因此必须在另一个构建步骤中完成(Eclipse通常会自动完成此操作,但使用Ant构建时不会自动完成)。
  • 许多构建设置会在编译服务器端时跳过"client"包中的Java和属性文件。在这种情况下,请将常量文件放在"shared"包中(如果有的话)。

谢谢您的回复。我成功地通过build.xml文件中的copy命令复制了文件。一切都很正常,但是当它尝试获取字符串时,我收到了错误提示:GWT.create()只能在客户端代码中使用!例如,不能从服务器代码中调用它。我是否漏掉了什么? - Sekz Jedi
1
在服务器端,你必须使用Hermes.get(MyConstantsWithLookup.class, myLanguageCode) 而不是 GWT.create(MyConstantsWithLookup.class)。 - Chris Lercher
是的,这就是我所做的,但不知何故我一直收到那个错误。我是否需要在我的EntryPoint类和xml模块中设置一些内容,就像在gwt-i18n-server中一样? - Sekz Jedi
1
不,你肯定在服务器端的某个类中调用了GWT.create()(可能是在客户端包中的某个类中,但由服务器执行)。看一下堆栈跟踪,它应该告诉你发生了什么!对于Hermes,请确保您在服务器端使用不同的代码(Hermes.get())和客户端代码(GWT.create())。 (对于gwt-i18n-server也是如此,但如果您在gwt.xml文件中进行设置等,则可以在服务器端和客户端上同时使用LocaleFactory.get(Class<T extends LocalizableResource> cls)。但这是可选的,并且在Hermes中不可用,据我所知。) - Chris Lercher
的确如此。由于我只专注于服务器端,所以我没有意识到我正在使用GWT.create()实例化我的常量类,以便从其他类中更轻松地调用它。当我将其注释掉并修复其他类时,一切都运行得非常完美。谢谢! - Sekz Jedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接