2017-01-23 10 views
0

Я разрабатываю простую систему резервирования в Grails 3.2.3 и хочу использовать новую библиотеку времени Java 8.Grails Java 8 Time JSON Simplification

@Resource(uri='/reservation', formats=['json']) 
class Reservation { 

    String groupName 
    int groupSize 
    LocalDateTime dateTime 
    int durationMinutes 

    static belongsTo = [calendar:ReservationCalendar] 

    static constraints = { 
     calendar  blank:false, nullable:false 
     groupName  blank:false, size:2..30 
     groupSize  blank:false, min:1 
     durationMinutes blank:false, min:1 
     dateTime  validator: { 
          if (it.isAfter(LocalDateTime.now().plusMinutes(30L))) { 
           return true 
          } else { 
           return ['dateBeforeEarliestReservationTime'] 
          } 
         } 
    } 
} 

Я вставил следующую запись в BootStrap.groovy:

def init = { servletContext -> 
    new ReservationCalendar(reservationObject:"reservable item1", reservationUnitsPerSlot:5).save() 
    new Reservation(calendar:1, groupName:"testers1", groupSize:2, dateTime:LocalDateTime.now().plusHours(2L), durationMinutes:30).save() 
    LocalDateTime maxDaysInFuture; 


} 

Теперь, когда я запустить приложение, все работает нормально. GET/резервирование URI называет индекс() действия и возврата:

[{"id":1,"calendar":{"id":1},"dateTime":{"class":"java.time.LocalDateTime","dayOfMonth":23,"dayOfWeek":{"enumType":"java.time.DayOfWeek","name":"MONDAY"},"dayOfYear":23,"hour":18,"minute":18,"month":{"enumType":"java.time.Month","name":"JANUARY"},"monthValue":1,"nano":629000000,"second":46,"year":2017,"chronology":{"calendarType":"iso8601","class":"java.time.chrono.IsoChronology","id":"ISO"}},"durationMinutes":30,"groupName":"testers1","groupSize":2}] 

Но когда я иду, чтобы создать новую запись резервирования от некоторых Java-агностик клиента, я предпочел бы иметь какой-то способ не имея знать о лежащие в основе структуры данных и иметь некоторый чистый вход, например, строка даты:

[{"id":1,"calendar":{"id":1},"dateTime":"01-23-2017 6:30PM CST","durationMinutes":30,"groupName":"testers1","groupSize":2}] 

Я читала Grails документации, но нет никаких четких примеров о том, как настроить вход/выход вашего ресурса. Мне нужен набор полей, таких как:

"dateTime":{"dayOfMonth":23,"month":1,"year":2017,"hour":18,"minute":30}, 

И создать объект времени из этих полей.

ответ

0

Мой обходной путь заключается в следующем:

1) Я использую обычный объект Date как DATETIME в моем классе домена. Я все еще использую Java 8 time api - когда я иду делать валидацию и логику в Date, я просто конвертирую ее в LocalDateTime каждый раз.

LocalDateTime t = LocalDateTime.ofInstant(dateTime.toInstant(), ZoneId.systemDefault()); 

2) В BootStrap.groovy, я зарегистрировал дружественный формат вывода в моей JSON ИАС.

SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy HH:mm"); 
JSON.registerObjectMarshaller(Reservation) { 
    def returnArray = [:] 
    returnArray['groupName'] = it.groupName 
    returnArray['groupSize'] = it.groupSize 
    returnArray['dateTime'] = dateFormat.format(it.dateTime) // other piece of this is in application.yml (grails.databinding.dateFormats) 
    return returnArray 
} 

3) В application.yml я определил grails.databinding.dateFormats содержать тот же дружественный формат:

grails: 
    databinding: 
     dateFormats: 
      - "MM-dd-yyyy HH:mm" 

Результат является JSON, который выдает примерно следующее:

[{"groupName":"testers1","groupSize":2,"dateTime":"01-24-2017 20:47"}] 

И, выполняя POST, чтобы добавить запись, мне просто нужно указать дату в виде отформатированной строки.

"dateTime":"01-24-2017 21:47" 

Не стесняйтесь, напишите решение groovier, если вы знаете одного!