2017-09-18 161 views
0

我使用的彈簧數據休息,我有以下通過休息利用休息春天的數據與引用創建資源

DonationRequest春天數據暴露現在我有

@Data 
@Entity 
@Table(name="donation_request",schema="public") 
public class DonationRequest { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="donation_request_id") 
    Integer donationRequestId; 

    @Column(name="expiry_datetime") 
    Date expiryDatetime; 

    @Column(name="blood_group") 
    String bloodGroup; 

    @Column(name="no_of_bottles") 
    String noOfBottles; 

    @OneToOne 
    @JoinColumn(name="hospital_id") 
    Hospital hospital; 

    @OneToOne 
    @JoinColumn(name="user_data_id") 
    UserData requester; 

    @Column(name="active") 
    Boolean active; 

} 

醫院

@Data 
@Entity 
@Table(name="hospital",schema="public") 
public class Hospital { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="hospital_id") 
    Integer hospitalId; 

    @Column(name="name") 
    String name; 

    @Column(name="address") 
    String address; 

    @Column(name="loc",columnDefinition = "geometry") 
    Point loc; 

} 

實體一個具有與上述相同的類定義的Android客戶端。醫院在Android客戶端啓動時緩存。現在我想在服務器上創建一個donationRequest實體。我可以通過將donationRequest對象的json發佈到/ api/donationRequests來輕鬆完成此操作。這個json也包含醫院對象。但新創建的捐贈請求和醫院並沒有聯繫在一起。

繼郵遞員不會創建鏈接JSON的類型:

{ 
    "bloodGroup":"AB+", 
    "hospital":{ 
     "hospitalId":1 
    } 
} 

我知道下面的JSON時創建鏈接:

{ 
    "bloodGroup":"AB+", 
    "hospital":"/api/hospitals/1" 
} 

我的問題是我如何使用第一種類型的創建鏈接json,因爲這是從android客戶端序列化dontaionRequest對象的自然方式?此外,我希望醫院通過/ api /醫院暴露,因此刪除該剩餘資源的不是選項

回答

1

它可以通過使用自定義HttpMessageConverter並限定自定義的內容類型可以是比標準以外的任何來實現(I使用的應用/ mjson):

MHttpMessageConverter.java

public class MHttpMessageConverter implements HttpMessageConverter<Object>{ 
    @Override 
    public boolean canRead(Class<?> aClass, MediaType mediaType) { 
     if (mediaType.getType().equalsIgnoreCase("application") 
       && mediaType.getSubtype().equalsIgnoreCase("mjson")) 
      return true; 
     else 
      return false; 
    } 

    @Override 
    public boolean canWrite(Class<?> aClass, MediaType mediaType) { 
     return false; 
    } 

    @Override 
    public List<MediaType> getSupportedMediaTypes() { 
     return new ArrayList<>(Arrays.asList(MediaType.APPLICATION_JSON)); 
    } 

    @Override 
    public Object read(Class<?> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException { 
     ObjectMapper mapper = new ObjectMapper(); 
     Object obj = mapper.readValue(httpInputMessage.getBody(),aClass); 
     return obj; 
    } 

    @Override 
    public void write(Object o, MediaType mediaType, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException { 

    } 
} 

CustomRestConfiguration的.java

@Configuration 
public class CustomRestConfiguration extends RepositoryRestConfigurerAdapter { 

    @Override 
    public void configureHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) { 
     messageConverters.add(new MHttpMessageConverter()); 
    } 
} 
+0

非常有趣的解決方案。自定義控制器不會更容易? – Cepr0

+0

對於自定義控制器,我將不得不單獨與所有實體一起執行此操作。 – ArslanAnjum

0

Spring Data REST正在使用HATEOAS。要引用我們必須使用它們的鏈接相關的資源:

創建醫院第一

POST /api/hospitals 
{ 
    //... 
} 

響應

{ 
    //... 
    "_links": [ 
     "hostpital": "http://localhost/api/hospitals/1", 
     //... 
    ] 
} 

然後得到「醫院」(或「自我」)的鏈接,並添加它到'donationRequests'有效載荷

POST /api/donationRequests 
{ 
    "bloodGroup":"AB+", 
    "hospital": "http://localhost/api/hospitals/1" 
} 

另一種方法 - 無需創建第一個「donationRequests」醫院

POST /api/donationRequests 
{ 
    //... 
} 

響應

{ 
    //... 
    "_links": [ 
     "hostpital": "http://localhost/api/donationRequests/1/hospital" 
     //... 
    ] 
} 

然後使用您的有效載荷文字鏈接到醫院PUT醫院donationRequests/1/hospital(注意內容類型:text/URI列表)

PUT http://localhost/api/donationRequests/1/hospital (Content-Type: text/uri-list) 
http://localhost/api/hospitals/1 

信息:Repository resources - The association resource

UPD ATE

如果有必要處理沒有資源鏈接,我們必須做一個custom rest controller

+0

兩件事情: - 1-醫院已創建。我只想參考。我已經告訴我,我知道可以使用其他資源鏈接來創建關聯鏈接。 我想知道是否有其他解決方案? – ArslanAnjum

+0

@ArslanAnjum以這種方式 - 只有手動 – Cepr0

+0

檢查我的答案。 – ArslanAnjum