ember-данные с серверной частью Spring / Hibernate

#ember.js #ember-data

#ember.js #ember-data

Вопрос:

Мне интересно, как я могу использовать ember-data, работая с серверной частью Spring / Hibernate Java. Обычно я бы использовал Jackson для возврата JSON, но, похоже, это не поддерживает спецификации, требуемые jsonapi.org .

В настоящее время компоненты возвращаются в иерархическом виде, подобном этому.

 {
  "id" : 1,
  "name" : "Bill",
  "surname" : "Smith",
  "address" : {
    "id" : 23,
    "number" : 21,
    "street" : "Vincent st",
    "state" : {
       "id" : 44,
       "name" : "Victoria"
       "abbreviation" : "VIC"
    }
    "postcode" : 9000
  }
}
  

Я не привязан к этой структуре, и ее можно изменить, чтобы использовать jsonapi, однако я не могу найти какой-либо плагин jackson, который сериализует / десериализует мои объекты в соответствии со спецификацией jsonapi.

Какие у меня варианты здесь? Я знаю, что могу написать свой собственный сериализатор / десериализатор для ember-data, но это было бы огромной проблемой, наверняка есть другие люди, использующие ember с серверной частью java.

Комментарии:

1. Этот пост должен дать вам несколько советов: springember.blogspot.de/2014/08 /…

Ответ №1:

Это выглядит знакомо из-за проблемы, с которой я столкнулся при разборе json с помощью DataFX (с использованием JavaFX), json также был сгенерирован Spring… В итоге я вернул страницу, которая обертывает вашего пользователя и создает некоторый json, который можно анализировать. Только мои 2cts… Я добавил следующее сопоставление запросов к моему PersonController:

 @RequestMapping(value="/persons", method=RequestMethod.GET, headers="Accept=application/json, application/xml")
public @ResponseBody Page<Person> getPersons(
    @RequestParam(value="page",required=false,defaultValue="0") String page,
    @RequestParam(value="size",required=false,defaultValue="20") String size,
    @RequestParam(value="orderby",required=false,defaultValue="name") String orderby){
        PersonRepository repository = context.getBean(PersonRepository.class);
        final PageRequest pr = new PageRequest( Integer.parseInt(page), Integer.parseInt(size), Direction.ASC, orderby);
        Page<Person> persons = (Page<Person>) repository.findAll(pr);
        return persons;
}
  

Ответ №2:

Я новичок в ember и все еще на стадии разработки с php в качестве серверной части, но я считаю, что у меня та же проблема, и я нашел то, что выглядит как исправление. Вы правы, что возиться с Джексоном было бы сложным подходом. Похоже, что внести изменения на стороне ember намного проще. Это руководство (http://lab.empirio.no/emberjs-say-hello-to-apigility.html ) обсуждается создание нашего собственного сериализатора в js на основе ActiveModelSerializer ember data, а затем изменение RestAdapter. В примере обсуждается создание стандартного приложения ToDo, которое, я уверен, вы уже видели в качестве примера.

Проблема в том, что серверная часть использует этот формат:

 {"name":"Testing","is_completed":false}
  

В то время как ember использует:

 {"todo":{"name":"Testing","is_completed":false}}
  

Вот такой же код:

 App.ApplicationSerializer = DS.ActiveModelSerializer.extend({
    primaryKey: 'todos_id',

    extract: function(store, type, payload, id, requestType) {
        this.extractMeta(store, type, payload);

        if(payload._embedded)
            payload = payload._embedded;

        if(requestType == 'updateRecord' || requestType == 'createRecord'){
            var data = {};
            data[type.typeKey] = payload;
            payload = data;
        }
        var specificExtract = "extract"   requestType.charAt(0).toUpperCase()   requestType.substr(1);
        return this[specificExtract](store, type, payload, id, requestType);
    }
});
  

… «мы манипулируем полезной нагрузкой путем расширения (копирования из RestAdapter).
функция createRecord изменяет поведение адаптера следующим образом: «

  createRecord: function(store, type, record) {
        var data = {};
        var serializer = store.serializerFor(type.typeKey);
        serializer.serializeIntoHash(data, type, record, { includeId: true });
        return this.ajax(this.buildURL(type.typeKey), "POST", { data: data[type.typeKey] });
    },
  

Я уверен, что здесь я многое упускаю и, вероятно, пропускаю некоторые шаги, поскольку я еще даже не пытался создать приложение, но это была проблема, которую я знал, что мне нужно решить, прежде чем я перейду на ember, и это кажется жизнеспособным решением. Я надеюсь, что это шаг в правильном направлении для вас в любом случае.

Редактировать: Я знаю, что вы не хотели менять формат ради соблюдения стандарта, но на самом деле пока нет стандарта для API-интерфейсов JSON и типов контента, ни одного, который был бы принят в любом случае. В этом руководстве используется HAL JSON, который ничем не отличается от того, что я вижу на jsonapi.org если это то, о чем ты говорил. Несмотря на это, у всех, похоже, возникает эта проблема, независимо от языка или фреймворков.Я думаю, что команда ember признает это и старается быть гибкими. Кроме того, поскольку ember-data все еще находится в бета-версии, я был бы более склонен вносить изменения там, а не писать java-версию для поддержки изменяющейся библиотеки. Кто знает? Возможно, ember-data будет иметь лучшую поддержку для разных бэкэндов до выпуска версии 1.0, хотя я не слышал никаких упоминаний об этом в дорожной карте.