2013-07-29 88 views
2

我定義了一個Google Cloud Endpoints,它使用Objectify來處理數據存儲。問題在於我的模型使用了對象化類com.googlecode.objectify.KeyGoogle Cloud Endpoint和Objectify

@Entity 
public class RealEstateProperty implements Serializable { 

    @Id 
    private Long id; 
    @Parent 
    private Key<Owner> owner; 
    private String name; 
    private Key<Address> address; 

} 

在我的終點,我定義創建一個RealEstateProperty的方法:

@ApiMethod(name = "create", path = "properties", httpMethod = HttpMethod.POST) 
public void create(RealEstateProperty property, User user) throws Exception { 
    } 

API Explorer,該create方法需要代表爲地址的Key的字符串。問題是我想提供地址而不是Key

是否可以創建一個端點objectify?如果是這樣,你如何設計你的數據模型來處理Key

回答

3

您可以創建通過API(終點)通信類包含一個地址字段,而不是重點領域:

public class RealEstatePropertyAPI implements Serializable { 

    private Long id; 
    private Key<Owner> owner; 
    private String name; 
    private Address address; 

} 

,並在您的端點:

@ApiMethod(name = "create", path = "properties", httpMethod = HttpMethod.POST) 
public void create(RealEstatePropertyAPI propertyAPI, User user) throws Exception { 
    //ie: get address from propertyAPI and find in datastore or create new one. 
} 

或者只是添加其他參數你的端點。

+0

這是我第一次嘗試,但似乎'objectify'處理與'Key'對象的一對一關係。當我沒有使用Key時,我在保存實體時遇到了異常。 '地址不是支持的類型'。 – Sydney

+0

我不確定我是否正確理解您,但是: 1)對於多值關係,請參閱: https://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Multi-Value_Relationship 2 )不保存RealEstatePropertyAPI獲取地址(和另一個數據)。在數據存儲區中查找給定地址並獲取密鑰或創建新密鑰,然後創建新的RealEstateProperty並填充數據。 – Mateusz

+0

好吧,我知道了,所以沒有辦法直接使用'objectify'模型。我必須使用臨時對象從客戶端獲取數據,然後將其轉換爲數據模型。 – Sydney

3

是的,似乎端點不支持物化鑰匙。這也給我帶來了一些問題。爲了避免在Maven構建拋出的錯誤,我註釋的關鍵屬性由端點https://developers.google.com/appengine/docs/java/endpoints/annotations被忽略:

@ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 

當使用端點添加新RealEstateProperty,在您的端點一個字符串參數,創建您的地址對象。將新的Address對象作爲參數傳遞給RealEstateProperty構造函數,並在構造函數中創建並分配鍵。

@Entity 
public class RealEstateProperty implements Serializable { 

    @Id 
    private Long id; 
    @Parent 
    private Key<Owner> owner; 
    private String name; 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    private Key<Address> address; 

} 
相關問題