2014-09-01 135 views
2

在我的項目中,我使用JAX-RS將一些實體暴露給一個JavaScript前端框架(AngularJS)。JAX-RS /實體最佳實踐

我不想急於加載我的實體關係,我寧願有多種方法來獲取客戶端需要的任何關係。

將我的實體序列化爲JSON/XML我使用JAXB並將關係的ID添加到類中。我現在最終將我的實體作爲一個實體以及一個DTO。

在每個POST上,我需要設置我的實體參考。

我想知道它是否是暴露實體的適當方式還是有更好的方法?

一個例子不是長的文本是始終明確,那就是:

@XmlRootElement 
@Entity 
public class Country { 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String countryName; 

    @ManyToOne 
    private Region region; 

    @Transient 
    private Integer regionId; 

    // getters & setters 

    // AVOID SERIALIZING REGION 
    @XmlTransient 
    public Region getRegion ... 

    // SERIALIZE REGION ID INSTEAD 
    public Integer getRegionId() { 
     if (region != null) 
      return region.getId(); 
     else 
      return null; 
    } 

    ... 

} 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
@Entity 
public class Region { 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String regionName; 

    // getters & setters 

    ... 

} 

@Stateless 
@Path("countries") 
public class CountryResource { 

    @PersistenceContext 
    private EntityManager em; 

    @GET 
    public List<Country> getAll() { 
     return em.createNamedQuery("Country.findAll", Country.class).getResultList(); 
    } 

    @PUT 
    public void saveCountry saveCountry(Country country) { 
     // UPDATE REFERENCES 
     country.setRegion(em.getReference(Region.class, country.getRegionId())); 
     em.persist(country); 
    } 

} 

你建議別的東西?

感謝,

F.D

回答

3

我發現它通常使用DTO pattern爲「反腐敗層」和一種用於web請求/響應機構公佈的API的一個好主意。

例如,讓我們拿你的國家班。如果您的Web API直接發送Country類(直接序列化爲JSON),那麼您會暴露部分應用程序代碼,Web API的使用者可能不應該知道這些代碼,以防止它們編寫代碼,以耦合到易於更改。

因此,您需要構建一個「物業包」類,作爲您的Web API消費者和協作者應該使用的常見「語言」的表示形式。

例如:

public class CountryDTO { 
    public final Integer id; 
    public final String countryName; 
    public final Integer regionId; 

    public CountryDTO(Country countryToSerialize){ 
     this.id = countryToSerialize.getId(); 
     this.countryName = countryToSerialize.getCountryName(); 
     this.regionId = countryToSerialize.getRegion().getId(); 
    } 
} 

這樣一來,如果將來你改變你的國家類的結構,你的API消費者仍然呈現相同的數據一致「形狀」(直到棄用/升級/以您的版本實踐爲準)。

因爲您可以選擇並選擇使用哪些字段,所以您還可以獲得細粒度,與庫無關的控制域對象如何序列化的方法。

最後,您不必擔心從請求中提取實體對象,以及您將ORM認爲是附加/未附加/瞬態/無論您是否將它們傳遞到應用程序代碼的混淆。然後,您可以在實例化一個域實體之前自由地添加基於嚴格瞬態DTO的驗證步驟。