有没有办法在客户端与服务器上实现不同的类?
要避免“为什么要这样做?”问题..我会详细说明
我正在转换一个非常大的Java客户端/服务器应用程序。目前它使用Swing GUI客户端并通过Spring远程处理(RPC)与服务器通信。使用GWT RPC和Spring服务不是问题,有几个很好的例子可用,而且一切似乎都运行良好。
客户端和服务器共有的几个类包含来回传递的数据。这些类还包含一些使用标准JRE类实现的行为。例如,一个类以特定于语言环境的方式包含,解析和格式化日期和时间,包括时区,DST等。我可以重写/重构它,但是应用程序超过1000万SLOC,结果只有数百万个引用这个类,所以重大改写不符合成本效益。
以此为例,GWT为解析和格式化日期提供了出色的i18n支持。但实施方式与JRE的实施方式不同。
所以我正在寻找一种切割方式,我可以将实现注入到我的DateTime类的shell中,具体取决于它是在客户端(使用GWT和本机JS)还是在服务器中(使用JRE) )。有一种巧妙的方法吗?也许使用模块文件XXXXX.gwt.xml。我正在寻找通用解决方案。
答案 0 :(得分:5)
您希望使用<super-source>
将覆盖一个包实现与另一个。
这是GWT用来模拟Java运行时类的,并且(以及其他)为com.google.gwt.regexp.shared.*
类的客户端和服务器提供了不同的实现。
答案 1 :(得分: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兼容。