使用Spring / Hibernate后端的ember-data

时间:2014-06-22 11:08:59

标签: ember.js ember-data

我想知道如何使用带有Spring / Hibernate Java后端的ember-data。我通常会使用Jackson来返回JSON,但这似乎不支持jsonapi.org所需的规范。

目前,bean以这样的分层结构返回。

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

我没有坚持这个结构,它可以修改为套件jsonapi,但是,我找不到任何将我的对象序列化/反序列化为jsonapi规范的jackson插件。

我有什么选择?我知道我能够为ember-data编写自己的序列化器/解串器,但这将是一个巨大的痛苦,当然还有其他人使用带有java后端的ember。

2 个答案:

答案 0 :(得分:1)

这看起来很熟悉我用DataFX解析json的问题(使用javaFX),json也是由Spring生成的...... 我最后返回一个包装你的Person的页面并创建一些可解析的json。 只是我的2个...我将以下请求映射添加到我的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;
}

答案 1 :(得分:0)

我是初学者,并且仍处于设计阶段,使用php作为后端,但我相信我遇到了同样的问题并且发现了什么看起来像是修复。你是对的,搞砸杰克逊将是一个困难的方法。看起来,在余烬方面做出改变似乎要容易得多。这个guide (http://lab.empirio.no/emberjs-say-hello-to-apigility.html)讨论了基于ember数据的ActiveModelSerializer在js中创建我们自己的序列化器,然后修改RestAdapter。这个例子正在讨论构建标准的ToDo应用程序,我确定你已经将其用作示例。

问题是后端使用这种格式:

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

虽然余烬使用:

{"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);
    }
});

...&#34;我们通过扩展(从RESTAdapter复制)来操纵有效负载。 createRecord-function更改适配器上的行为,如下所示:&#34;

 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,这似乎是一个可行的解决方案。无论如何,我希望它朝着正确的方向迈出一步。

编辑:我知道你并不想为了坚持标准而改变格式,但是JSON API和内容类型确实没有标准,而不是“#”。无论如何都接受了。本指南使用HAL + JSON,它看起来与我在jsonapi.org上看到的不同,如果那是你在谈论的内容。无论如何,无论后端语言或框架如何,每个人似乎都遇到了这个问题。我认为ember团队认识到这一点,并且正在努力保持灵活性。此外,由于ember-data仍处于测试阶段,我更倾向于在那里进行更改,而不是编写java端来支持更改库。谁知道?也许ember-data在1.0发布之前会对不同的后端提供更好的支持,尽管我还没有在路线图中听到过任何提及它的信息。