2011-06-28 59 views
5

在我的GWT項目中,我的服務返回了我已經定義的類型Shield的對象。由於客戶端和服務器都在使用Shield類型,因此我已將類定義放入共享包中。在共享包中使用GWT的NumberFormat類

類使用com.google.gwt.i18n.client.NumberFormat類(補發,除其他外,java.text.DecimalFormat中)。

的問題是,的NumberFormat不能放在共享包,因爲它創造的LocaleInfo使用GWT.create()的實例。

有什麼辦法可以使用com.google.gwt.i18n.client.NumberFormat從共享包內?

回答

2

總之,號

共用包應該只包含由客戶端和服務器都使用屬於(AND CAN)的任何邏輯或數據類型。

原因GWT提供他們的數字格式類是,在他們的words -

在一些類,類的功能是完全模擬的,從而提供了另一種包的類似常規太貴,代替。

反之亦然,NumberFormat的GWT實現是javascript特定的,當然不能在服務器端使用(在你的情況下是Java)。

您將不得不嘗試將格式化邏輯從此類中移出,並分別移入服務器端(使用java的NumberFormat)和客戶端(使用gwt的NumberFormat)。您可以將其餘部分保留在共享包中。

+0

感謝@Bhat,我認爲這可能是這種情況。多麼不幸:-( – luketorjussen

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"/> 
+0

很漂亮,GWT應該有一個解決方案。 – vinnyjames