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

同一类的GWT客户端和服务器实现,gwt,client,rpc,Gwt,Client,Rpc,有没有办法让同一个类在客户机和服务器上实现得不同 为了避免“你为什么要那样做?”的问题。。我将详细说明 我正在转换一个非常大的Java客户机/服务器应用程序。目前,它使用SwingGUI客户端,并通过SpringRemoting(RPC)与服务器对话。将GWT RPC与Spring服务一起使用不是问题,有几个很好的示例可用,而且似乎都很好地工作 客户端和服务器共用的几个类包含来回传递的数据。这些类还包含一些使用标准JRE类实现的行为。例如,一个类以特定于语言环境的方式包含、解析和格式化日期和时间

有没有办法让同一个类在客户机和服务器上实现得不同

为了避免“你为什么要那样做?”的问题。。我将详细说明

我正在转换一个非常大的Java客户机/服务器应用程序。目前,它使用SwingGUI客户端,并通过SpringRemoting(RPC)与服务器对话。将GWT RPC与Spring服务一起使用不是问题,有几个很好的示例可用,而且似乎都很好地工作

客户端和服务器共用的几个类包含来回传递的数据。这些类还包含一些使用标准JRE类实现的行为。例如,一个类以特定于语言环境的方式包含、解析和格式化日期和时间,包括时区、DST等。我可以重写/重构它,但应用程序的SLOC超过1000万,仅此一个类就有数百万个引用,因此大规模重写并不划算

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


因此,我正在寻找一种解理器方法,根据它是在客户端(使用GWT和本机JS)还是在服务器(使用JRE)中,我可以将实现注入到DateTime类的shell中。有什么巧妙的方法可以做到这一点吗?可能使用模块文件XXXXX.gwt.xml。我正在寻找一个通用的解决方案。

我想您正在寻找的是:
在您的项目gwt.xml文件中。它告诉GWT生成器在哪里查找要转换为JS的客户端代码。在我的项目中,我将其设置为:

<source path="client" />
<source path="shared" />

基本上,客户机代码位于客户机目录中,在shared中,我们为客户机和服务器端保留bean和一些数据包装器

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

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

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

您可能希望使用来用另一个包实现覆盖一个包实现。
这是GWT用来模拟Java运行时类的,并且(除其他外)为
com.google.GWT.regexp.shared.*
类的客户机和服务器提供不同的实现。

这不是所要求的。他有多个在客户端和服务器上使用的类(是的,通常是共享的),但这些类包含非GWT JRE代码,因此,它们只能在服务器上工作。使用相同的类但使用不同的实现会让我的眼睛受伤。对我来说,这将终止一个设计合同,程序员必须知道下面的实现是什么。难道没有一种方法可以在接口后面使用两个不同的类来实现接口吗?这就是解决问题的方法(如果你问我的话)。@John-我提到,对于包含非GWT代码的类,fork是不起作用的。也许我对此不是很清楚。超级源代码真的覆盖了其他实现还是只是添加了?我在文档中找不到最重要的方面(但是会很好)。在一个文件一个文件的基础上,它会覆盖。就好像它出现在类路径的前面(实际上就是这样实现的(有点);参见)