我想知道如何使用带有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。
答案 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发布之前会对不同的后端提供更好的支持,尽管我还没有在路线图中听到过任何提及它的信息。