2016-04-07 6 views
0

Şu anda REST'de ve özellikle "iyi" Rest, hipermedia ve onunla birlikte gelen tüm iyi uygulamalarda beceriler edinmeye çalışıyorum.REST/Java'da iyi uygulamalar

Bunu yapmak için, seçimimden veri içeren bir prototip REST sunucusu geliştirmem ve daha sonra gelen gerçek bir projede kullanmak zorunda olduğum herşeyi hayata geçirmem istendi. Bu yüzden json kullanımı için Spring boot ve Jackson kullanarak bir sunucu yaptım.

Benim veri mimarisi bu yakındır: Ben kusursuz

{ "name":"Ariane V","country":"Europe","firstFlight":null,"GTO_Payload":1.0,"LEO_Payload":2.3,"weight":136.0 } 

şey JSON nesnesi alabilir Ariane V Falcon 9, vb gibi (Boşluğu = D gibi) LaunchVehicle bir koleksiyona sahip Benim LaunchVehicle'ımın içinde, bazı Dizeleri ve Şamandıraları içeren bir nesne olacak bir "uzay ajansı" alanı eklemek istiyorum. Ancak, istemci bir LaunchVehicle aldığında, onun tam SpaceAgency nesnesini almasını istemiyorum, sadece adın adı. Buradan, uzay ajansının bağlantısını, alacağı yanıtta yer alan bir hiper medya bağlantısıyla takip edebilecekti.

Bunu nasıl yapabilirim? Şu anda yalnızca SpaceAgency nesnesi ve tüm alanları ile tam LaunchVehicle nesnesini istemciye gönderebiliyorum. İstediğimi yapan herhangi bir ek açıklama var mı? Teşekkürler;)

public class LaunchVehicle { 


    private String name; 
    private String country; 
    private Date firstFlight; 
    private Map<String, Float> characteristics; 
    private SpaceAgency spaceAgency; 

    @JsonCreator 
    constructor... 

    @JsonProperty(required=false) 
    getters and setters... 

} 

Çok teşekkür ederim, yeterince hassas veya anlaşılır değilse tereddüt etmeyin.

+0

Tüm SpaceAgency öğesini serpiştirmekle ilgili sorun nedir ve yalnızca sizin beğendiğiniz kısmını kullanın. Performans sorunu? – pmartin8

+0

Şu an için iyi bir uygulama arıyorum. Hipermediyi kullanmalıyım ve bu yüzden de "yol-yapma" hipergrafisini takip eden yükteki SpaceAgency nesnesine bağlantıyı koymayı düşünüyordum. Bu şekilde, tam nesneyi aynı istekte göndermem gerekmeyecek. Şu anda sadece bir prototip geliştiriyorum, bu yüzden performans sorunu yok, ama doğru yapmak zorundayım, bu performans endişeleri ile gerçekten büyük bir uygulama gibi. – ToyToy

+0

Tamam o zaman çözümüme bir göz atın. SpaceAgency nesnesinde, JSON’unuzda bulunan tüm özellikleri göz ardı etmenize gerek yoktur. JSON deserializer'ınız unmapped özelliklerini unutmamalıdır. – pmartin8

cevap

1

sınıf düzeyinde @JsonIgnoreProperties ek açıklama deneyin. Bu size istediğiniz özelliği sağlamalıdır. Aksi takdirde, yanıt modelinizi oluşturmak için her zaman bir çeşit DTO nesnesi kullanabilirsiniz ve yalnızca API katmanında kullanılacak alanlar vardır.

API katmanınız için uygun bir DTO/ApiModel kullanıp JSON ek açıklamaları içeren tam bir etki alanı nesnesine sahip olmayı tercih ederim.

+0

Thansk @JsonIgnoreProperties yöntemi ile ilgili olarak, istemciye tam bir SpaceAgency nesnesini başka bir url'den okuma izni vereyim? O zaman da alanlar göz ardı edilmemeli mi? – ToyToy

+0

Seni anlayabiliyorsam, model sınıflarının içindeki json açıklamaları ile söylemeye çalıştığım şey buydu ... Benim için bir şey senin uygulama modelin, diğeri de API modelin. SpaceAgency model sınıfınız uygulamanızda benzersizdir, ancak n Uygulama API'sine bağlı olarak farklı "görünümler" (DTO) göndermek için –

+0

Ayrıca, model sınıflarınız ve API yanıtlarınız arasındaki herhangi bir bağlantıyı önlerim. Bu şekilde, modelinizin herhangi bir JSON bilgisini temizlemesine ve –

0

Eğer SpaceAgency sınıfınız sadece serileştirmek için gereksinim duyduğunuz özellikleri tanımlarsa, Jackson bunları sadece yeniden seri hale getirecektir. Eşlenmemiş özellikleri unutacak.

+0

Evet, ama aradığım şey bu değil. İstediğim şey şu şekildedir: 'code' {" name ":" Ariane, ..., "spaceAgency": "ESA"}, "_link": {"_ self": ..., "ESA" : "url/api/spaceAgency/ESA"} – ToyToy

+0

Bana gösterdiğin sonuç bir JSON. JSON, programdaki çıktı değil, çıktı değil mi? – pmartin8

+0

JSON'u alıcımın bir girdisi olarak alıyorum ve gönderdim Yanıt olarak daha önce bahsettiğim JSON'u geri döndüm Yine de çalışıyorum, bu yüzden mutluyum! – ToyToy

0

Bu

JsonParser parser = new JsonParser(); 
JsonObject obj = parser.parse(spaceAgency).getAsJsonObject(); 
String agencyName = obj.get("agencyName").getAsString(); 
0

Uzay ajansına bir köprü olarak başvurmanız gerektiğini düşünüyorum. Eğer veri aktarım nesnesi bağlantıyı belirtmek gerekir

{ "name":"Ariane V", 
    "country":"Europe", 
    < other fields omitted > 
    "_links": { 
    "agency": { "href": "agencies/ESA" }, 
    < other links omitted > 
    } 
} 

Bunu başarmak için: gibi

Yani JSON bakacağız. Bunu, bu türden bir nesneye gönderme yapmayın - bunu yapmak, istemciyi istemese bile bu nesneyi doldurmak anlamına gelir.

Bunu nasıl başardığınız, kullandığınız teknolojiye göre değişir.Jersey'de "gerçek" DİNLENME tüm hakkında ne olduğunu böyle Bağlama

public class LaunchVehicle { 
    ... 
    @InjectLink(resource=AgencyResource.class) 
    URI agencyLink; 
    ... 
} 

https://jersey.java.net/documentation/latest/declarative-linking.html

bu. Ancak, gerçek dünyadaki birçok çözümün aslında hiper bağlantıları kullanmadan REST yaptığını iddia ettiğini unutmayın. JSON'nuzda String agencyId alanına sahip olmak daha kolay bir çözüm olacaktır. Bu, ajans ayrıntılarını almak için bir URL şablonuna yerleştirilebilir.

+0

NB: Avrupa bir ülke değil;) – slim

+0

Evet Biliyorum, hatta içinde yaşıyorum ^^ Bu bir deneme projesi, uzay rampalarımın kökeni koymak için bir alana ihtiyacım vardı, bu yüzden "ülke" ilkimdi düşündük. Bu ABD, Rusya ve Japonya için iyi çalışıyor ... Bize çalışmayı deneyen Avrupa'ya lanet olsun! : P – ToyToy