相同类的GWT客户端和服务器实现

10

有没有办法在客户端和服务器上以不同的方式实现相同的类?

为了避免被问到“为什么要这样做?”的问题...我会详细说明。

我正在转换一个非常大的Java客户端/服务器应用程序。目前它使用一个Swing GUI客户端,并通过Spring远程调用(RPC)与服务器通信。使用GWT RPC与Spring服务不是问题,有几个优秀的示例可用,它们似乎都很有效。

一些既是客户端又是服务器端共同使用的类包含来回传递的数据。这些类还包含使用标准JRE类实现的一些行为。例如,一个类包含、解析和格式化日期和时间,包括时区、DST等,以区域设置特定的方式进行。我可以重写/重构它,但应用程序超过1000万行代码,仅这个类就有数百万个引用,所以进行重大重写是不划算的。

以此为例,GWT提供了出色的i18n支持,用于解析和格式化日期。但是,实现方式与JRE不同。

因此,我正在寻找一种聪明的方法,可以根据DateTime类是否在客户端(使用GWT和本机JS)或服务器(使用JRE)中,在其外壳中注入一个实现。有没有巧妙的方法可以做到这一点?也许使用模块文件XXXXX.gwt.xml。我正在寻找一个通用的解决方案。

2个回答

5
你需要使用 <super-source> 来覆盖一个包的实现。 这是 GWT 用来模拟 Java 运行时类的方法,它可以为客户端和服务器提供不同的实现,例如 com.google.gwt.regexp.shared.* 类。

超级源码真的是覆盖了其他实现还是只是添加了呢?我在文档中没有找到覆盖方面的内容(但这将是很好的)。 - Dr. Max Völkel
1
在逐个文件的基础上,它会进行覆盖。就好像它早在类路径中出现一样(实际上它是这样实现的(有点);请参见http://code.google.com/p/google-web-toolkit/wiki/ResourceOracle) - Thomas Broyer

0
我认为你在寻找的是这个:在你的项目gwt.xml文件中添加<source path="client" />。它告诉GWT生成器在哪里查找客户端代码以转换为JS。在我的项目中,我是这样设置的:
<source path="client" />
<source path="shared" />

基本上客户端代码在客户端目录中,而在共享目录中,我们保留了一些用于客户端和服务器端的bean和数据包装器。

你可以做的是像上面那样添加你想要转换为客户端的包和源路径。但你必须记住,你将要转换的类只能由GWT生成器转换为客户端Java脚本中的对象和属性组成。我也不确定是否可以在源路径中放置更精确的路径,例如:

<source path="shared/beans/whatever" />

另一个缺点是,如果您使用GWT i18n支持,它会自行处理编译时的不同语言环境 - 这是好的。如果您决定使用自己的机制,则必须在类中包含一些逻辑以了解当前使用的语言环境,并且这必须与GWT兼容。

1
这不是被问到的内容。他有多个类在客户端和服务器上使用(是的,通常会在共享中),但这些类包含非 GWT JRE 代码,因此按原样,它们只能在服务器上工作。 - John
1
制作相同的类但使用不同的实现方式会让我感到头痛。对我来说,这将违反设计契约,程序员必须知道底层的实现方式。难道没有一种方法可以使用符合某个接口的两个不同类的实现方式吗?如果你问我,这就是解决你的问题的方法。 - Sven
@John - 我提到对于包含非 GWT 代码的类,它不会起作用。也许我没有表达清楚。 - jjczopek

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