在我的GWT项目中,我的服务返回了我定义的 Shield 类型的对象。由于客户端和服务器都在使用 Shield 类型,我已将类定义放在共享包中。
Shield 类使用 com.google.gwt.i18n.client.NumberFormat 类(除其他外, java.text.DecimalFormat的替代品) )。
问题是 NumberFormat 无法放入共享包中,因为它使用GWT.create()创建 LocaleInfo 的实例。
有什么方法可以在共享包中使用 com.google.gwt.i18n.client.NumberFormat 吗?
答案 0 :(得分:5)
我通过创建一个SharedNumberFormat,然后是一个从未使用过的服务器版本的空客户端存根来解决这个问题。
这是我的SharedNumberFormat.java,您猜对了,它可以在共享代码中使用,并且可以在客户端和服务器端正常工作:
import java.text.DecimalFormat;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;
/**
* The purpose of this class is to allow number formatting on both the client and server side.
*/
public class SharedNumberFormat
{
private String pattern;
public SharedNumberFormat(String pattern)
{
this.pattern = pattern;
}
public String format(Number number)
{
if(GWT.isClient())
{
return NumberFormat.getFormat(pattern).format(number);
} else {
return new DecimalFormat(pattern).format(number.doubleValue());
}
}
}
然后我在我的超级源代码中删除了java.text.DecimalFormat实现:
package java.text;
/**
* The purpose of this class is to allow Decimal format to exist in Shared code, even though it is never called.
*/
@SuppressWarnings("UnusedParameters")
public class DecimalFormat
{
public DecimalFormat(String pattern) {}
public static DecimalFormat getInstance() {return null;}
public static DecimalFormat getIntegerInstance() {return null;}
public String format(double num) {return null;}
public Number parse(String num) {return null;}
}
我有额外的方法,因为我使用那个类服务器端,如果它们不在那里,编译器会对它有所了解。
最后,不要忘记将超级源标记添加到* .gwt.xml:
<super-source path="clientStubs"/>
答案 1 :(得分:2)
简而言之,不是。
共享包应该只包含客户端和服务器使用的任何逻辑或数据类型(AND CAN)。
gwt提供数字格式类的原因是words -
在某些类中,类的功能太昂贵而无法完全模拟,因此提供了另一个包中的类似例程。
反之亦然,NumberFormat
的GWT实现是特定于javascript的,当然不能在服务器端使用(在你的情况下是Java)。
您必须尝试将格式化逻辑分别从此类移出到服务器端(使用java的NumberFormat)和客户端(使用gwt的NumberFormat)。您可以将其余部分保留在共享包中。