2011-06-28 7 views
5

En mi proyecto GWT mi servicio devuelve un objeto de tipo Shield que he definido. A medida que el escudo tipo está siendo utilizado por el cliente y el servidor, he puesto la definición de clase en el paquete compartido.Usando la clase NumberFormat de GWT en el paquete compartido

El clase Escudo utiliza la clasecom.google.gwt.i18n.client.NumberFormat (un sustituto de, entre otros, java.text.DecimalFormat).

La cuestión es que NumberFormat no se puede poner en el paquete compartido, ya que crea una instancia de LocaleInfo usando GWT.create().

¿Hay alguna manera de que pueda usar com.google.gwt.i18n.client.NumberFormat dentro del paquete compartido?

Respuesta

2

En resumen, Nº

paquetes compartidos sólo deben contener ningún tipo de lógica o de datos que son (y puede) utilizados por el cliente y el servidor.

La razón GWT proporciona su número de clase de formato es, en su words -

En algunas clases, la funcionalidad de la clase es demasiado caro para ser emulado por completo, por lo que se proporciona una rutina similar en otro paquete en lugar.

Viceversa, la implementación de GWTs NumberFormat es javascript específico y, por supuesto, no se puede utilizar en el lado del servidor (Java en su caso).

Deberá intentar mover la lógica de formateo fuera de esta clase y hacia el lado del servidor (usando NumberFormat de Java) y del lado del cliente (usando NumberFormat de gwt), respectivamente. Usted puede mantener el resto de ella en el paquete compartido.

+0

Gracias @Bhat, pensé que esto puede ser el caso. Qué desgracia :-( – luketorjussen

5

He resuelto este problema mediante la creación de un SharedNumberFormat y luego un trozo del lado del cliente vacío para la versión de servidor que no se usa nunca.

Aquí es mi SharedNumberFormat.java, que, lo has adivinado, se puede utilizar en código compartido y funcionará bien tanto en el lado del cliente y el servidor:

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()); 
     } 
    } 
} 

entonces apagar la implementación java.text.DecimalFormat en mi súper fuente:

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;} 
} 

tengo métodos adicionales de allí porque uso que del lado del servidor de clase y el compilador se mete en un ajuste de ello si no están allí.

Por último, no se olvide de agregar su etiqueta de super-fuente a su * .gwt.xml:

<super-source path="clientStubs"/> 
+0

que es hermoso. GWT realmente debe tener una solución para esto. – vinnyjames

Cuestiones relacionadas