Pregunta

Si me sale el siguiente JSON desde un cliente REST, ¿cómo puedo elegantemente unmarshal la java.util.Date? (¿Es posible sin proporcionar (aka. Codificación dura) el formato, eso es lo que quiero decir con elegancia ...)

{
  "class": "url",
  "link": "http://www.empa.ch",
  "rating": 5,
  "lastcrawl" : "2009-06-04 16:53:26.706 CEST",
  "checksum" : "837261836712xxxkfjhds",
}
¿Fue útil?

Solución

La forma más limpia es probablemente registrar un DataBinder personalizado para posibles formatos de fecha.

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CustomDateBinder extends PropertyEditorSupport {

    private final List<String> formats;

    public CustomDateBinder(List formats) {
        List<String> formatList = new ArrayList<String>(formats.size());
        for (Object format : formats) {
            formatList.add(format.toString()); // Force String values (eg. for GStrings)
        }
        this.formats = Collections.unmodifiableList(formatList);
    }

    @Override
    public void setAsText(String s) throws IllegalArgumentException {
        if (s != null)
            for (String format : formats) {
                // Need to create the SimpleDateFormat every time, since it's not thead-safe
                SimpleDateFormat df = new SimpleDateFormat(format);
                try {
                    setValue(df.parse(s));
                    return;
                } catch (ParseException e) {
                    // Ignore
                }
            }
    }
}

También había necesidad de implementar un PropertyEditorRegistrar

import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;

import grails.util.GrailsConfig;
import java.util.Date;
import java.util.List;

public class CustomEditorRegistrar implements PropertyEditorRegistrar {
    public void registerCustomEditors(PropertyEditorRegistry reg) {
        reg.registerCustomEditor(Date.class, new CustomDateBinder(GrailsConfig.get("grails.date.formats", List.class)));
    }
}          

y crear una definición de primavera-frijol en su griales-app / conf / primavera / resources.groovy:

beans = {
    "customEditorRegistrar"(CustomEditorRegistrar)
}

y finalmente definir los formatos de fecha en su griales-app / conf / Config.groovy:

grails.date.formats = ["yyyy-MM-dd HH:mm:ss.SSS ZZZZ", "dd.MM.yyyy HH:mm:ss"]

Otros consejos

Tenga en cuenta que la nueva versión de Grails 2.3 o versiones posteriores es compatible con este tipo de función fuera de la caja. Ver formatos de fecha para el enlace de datos de

Dicho esto, si se ven obligados a utilizar una versión de Grails antes de la 2.3, el CustomEditorRegistrar se pueden actualizar mediante el siguiente código para eliminar la advertencia desaprobación, y también utiliza la anotación @Component, lo que le permite eliminar / salta la etapa de añadir el grano directamente en resources.groovy. Tampoco que he cambiado el nombre de la propiedad de configuración griales a grails.databinding.dateFormats, que coincide con la propiedad ahora compatible con Grails 2.3 +. Por último, mi versión es una .groovy, no .java archivo.

import javax.annotation.Resource
import org.codehaus.groovy.grails.commons.GrailsApplication
import org.springframework.beans.PropertyEditorRegistrar
import org.springframework.beans.PropertyEditorRegistry
import org.springframework.stereotype.Component

@Component
public class CustomEditorRegistrar implements PropertyEditorRegistrar {

    @Resource
    GrailsApplication grailsApplication

    public void registerCustomEditors(PropertyEditorRegistry reg){
        def dateFormats = grailsApplication.config.grails.databinding.dateFormats as List
        reg.registerCustomEditor(Date.class, new CustomDateBinder(dateFormats))
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top