我目前正在尝试获取REST技能,特别是“好”的休息,超媒体以及随之而来的所有良好实践。
为了做到这一点,我被要求开发一个原型REST服务器,其中包含我选择的数据,并实现我必须在之后的实际项目中使用的所有内容。 所以我用Spring引导服务器和Jackson进行json处理。
我的数据架构接近于此:我有一个LaunchVehicle(我喜欢space = D)的集合,如Ariane V,Falcon 9等。我可以完美地检索JSON对象
free
问题是,我想在LaunchVehicle中添加一个“空间代理”字段,该字段是包含一些字符串和浮点数的对象。但是,当客户端检索LaunchVehicle时,我不希望它检索完整的SpaceAgency对象,只是exemple的名称。从这里开始,他将能够通过其收到的回复中包含的超媒体链接来跟踪与航天局的联系。
我该怎么做?现在,我只能使用SpaceAgency对象及其所有字段向客户端发送完整的LaunchVehicle对象。是否有任何注释做我想要的?谢谢;)
{ "name":"Ariane V","country":"Europe","firstFlight":null,"GTO_Payload":1.0,"LEO_Payload":2.3,"weight":136.0 }
非常感谢,如果我不够精确或不够理解,请不要犹豫。
答案 0 :(得分:1)
在类级别尝试@JsonIgnoreProperties注释。这应该为您提供所需的功能。
否则,您总是可以使用某种DTO对象来创建响应模型,并且只有将在API层使用的字段。
我更愿意为您的API层使用适当的DTO / ApiModel,而不是使用带有JSON注释的完整域对象。
答案 1 :(得分:0)
如果您的SpaceAgency类仅定义了反序列化所需的属性,那么Jackson只会对这些属性进行反序列化。它将忘记未映射的属性。
答案 2 :(得分:0)
您可以将Gson API用于此
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(spaceAgency).getAsJsonObject();
String agencyName = obj.get("agencyName").getAsString();
答案 3 :(得分:0)
答案 4 :(得分:0)
我认为你应该将航天局作为超链接引用。
所以JSON看起来像:
{ "name":"Ariane V",
"country":"Europe",
< other fields omitted >
"_links": {
"agency": { "href": "agencies/ESA" },
< other links omitted >
}
}
要实现此目的,您需要在数据传输对象中指定链接。不要将它作为对该类型的实际对象的引用 - 这样做意味着填充该对象,即使客户端没有要求它。
如何实现这一点取决于您使用的技术。在泽西岛,它是
public class LaunchVehicle {
...
@InjectLink(resource=AgencyResource.class)
URI agencyLink;
...
}
https://jersey.java.net/documentation/latest/declarative-linking.html
像这样的链接就是“真正的”REST的全部内容。但请注意,许多现实世界的解决方案声称在不实际使用超链接的情况下进行REST。更糟糕的解决方案是在您的JSON中添加String agencyId
字段,该字段可以放入网址模板中以获取代理商详细信息。