2011-11-09 7 views
6

He estudiado cuidadosamente Jonik's entry para personalizar el formato BigDecimal en Wicket. Gracias por esta excelente pieza de código. Desafortunadamente no puedo hacer que funcione para mi caso de uso.Registro global de formatos de campo en Wicket

Quiero registrar el formato de fecha a nivel mundial y estoy usando el siguiente código en la subclase de aplicación:

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator converterLocator = new ConverterLocator(); 
    converterLocator.set(Date.class, new DateConverter() { 

     @Override 
     public DateFormat getDateFormat(Locale ignore) { 
      return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
     } 

    }); 
    return converterLocator; 
} 

Luego, cuando el uso de los campos de fecha en las páginas web el código es el siguiente:

form.add(new TextField<Date>("dateField")); 

Cuando se procesa, los campos de fecha muestran el formato estándar java.text.DateFormat.SHORT (02.11.11 11:59) que viene de la clase org.apache.wicket.util.convert.converter.DateConverter en lugar de mi SimpleDateFormat personalizado (02.11.2011 11:59:42).

He comprobado que java.util.Date se usa en todo momento. La versión de Wicket es 1.4.12.

¿Alguna idea?

+0

Esto funciona bien en un inicio rápido 1.4.12, utilizando el nuevo TextField ("dateField", nuevo Modelo (new Date()). ¿Cuál es el modelo de TextField? Si el Formulario tiene un CompoundPropertyModel, ¿qué clase es la propiedad con la que dateField resuelve? –

+0

Gracias Xavi. El formulario es un 'CompoundPropertyMobile' que se refiere a una entidad de persistencia cuyo' dateField' es java.util.Date. Como estamos utilizando entidades de persistencia, los campos al final de los encadenamientos getter/setter son tipos de datos en bruto de Java, no implementaciones de IModel. ¿Este es el problema? –

+0

¿Está seguro de que su 'newConverterLocator()' está siendo utilizado? ¿Ha depurado a través de 'Component.getConverter (Class)' para ver qué está pasando? Puede hacer esto fácilmente poniendo un punto de interrupción en una anulación en este componente en particular. –

Respuesta

5

Creo que su dateField tiene el tipo java.util.Date, pero el objeto real (cargado desde la base de datos?) Es, p. java.sql.Timestamp o algún otro hijo de java.util.Date. Es por eso que ConverterLocator elige otro convertidor en lugar del suyo. El código fuente de la ConverterLocator tiene la siguiente:

set(Date.class, new DateConverter()); 
set(Calendar.class, new CalendarConverter()); 
set(java.sql.Date.class, new SqlDateConverter()); 
set(java.sql.Time.class, new SqlTimeConverter()); 
set(java.sql.Timestamp.class, new SqlTimestampConverter()); 

Por lo tanto, es necesario conocer el tipo de tiempo de ejecución exacta de su dateField y anular convertidor para él.

+0

Además, evite usar 'java.util.Date' en su código. Utilice tipos más específicos - 'java.sql.Date' para una fecha (por ejemplo, una fecha de nacimiento), java.sql.Time por un tiempo (p. Ej., Una hora de llegada del tren) y java.sql.Timestamp para el momento exacto del tiempo (por ejemplo, un horario de reunión programado). – kan

+0

+1 para usar la fuente, también es probable que sea la razón por la que todavía está usando 'DateFormat.SHORT', todos parecen ser el valor predeterminado. –

+0

@ XaviLópez Te digo que ha anulado el convertidor para 'java.util.Date' solamente, pero su tipo real es algo diferente, muy probablemente' java.sql.Timestamp', por lo que wicket usa el predeterminado. – kan