Дата Грааля демаршаллинг - PullRequest
13 голосов
/ 08 июня 2009

Если я получаю следующий json от клиента RESTful, как мне элегантно демонтировать java.util.Date? (Возможно ли это без предоставления (иначе говоря, жесткого кодирования) формата, это то, что я имею в виду под элегантно ...)

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

Ответы [ 2 ]

18 голосов
/ 08 июня 2009

Самый простой способ - это зарегистрировать пользовательский DataBinder для возможных форматов даты.

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

Вам также необходимо реализовать 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)));
    }
}          

и создайте определение Spring-bean-компонента в вашем приложении grails-app / conf / spring / resources.groovy:

beans = {
    "customEditorRegistrar"(CustomEditorRegistrar)
}

и, наконец, определите форматы даты в вашем grails-app / conf / Config.groovy:

grails.date.formats = ["yyyy-MM-dd HH:mm:ss.SSS ZZZZ", "dd.MM.yyyy HH:mm:ss"]
5 голосов
/ 12 июня 2014

Имейте в виду, что новая версия Grails 2.3+ поддерживает этот тип функций "из коробки". См. Форматы даты для привязки данных

С учетом сказанного, если вы вынуждены использовать версию Grails до 2.3, CustomEditorRegistrar может быть обновлен с использованием следующего кода для устранения предупреждения об устаревании, а также использует аннотацию @Component, которая позволяет удалить / пропустить этап добавления компонента непосредственно в resources.groovy Также не то, чтобы я изменил имя свойства конфигурации grails на grails.databinding.dateFormats, что соответствует свойству, которое теперь поддерживается в Grails 2.3+. Наконец, моя версия - файл .groovy, а не .java.

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))
    }
}
...