2012-12-28 53 views
0

我使用可變數量的列創建網格。我快完成了,但只剩下一件事了......我不能訪問屬性Address(PersonProperties接口)。我不知道如何正確編寫@Path。如果有人有任何想法,請給我建議。GWT/GXT,JSON,帶陣列的@Path註釋

我有這樣的JSON:[ { "FirstName": "John", "LastName": "Doe", "Age": 23, "Details": [ { "Address": "Apt R113", "City": "Boston", "ZipCode": "30523" }, { "Address": "ABC 22", "City": "Paris", "ZipCode": "51112" } ] } ]

然後PropertyAccess接口:

public interface PersonProperties extends PropertyAccess<PersonDTO> { 

ModelKeyProvider<PersonDTO> key(); 

ValueProvider<PersonDTO, String> FirstName(); 

ValueProvider<PersonDTO, String> LastName(); 

ValueProvider<PersonDTO, Integer> Age(); 

@Path("Details???Address") 
ValueProvider<PersonDTO, String> Address(); 

}

+0

您是否使用AutoBeans將JSON編組爲對象圖?根據您發佈的內容,看起來您缺少該步驟。 –

回答

2

假設你PersonDTO對象是JSON對象表示,我會假設你有一個接口型號(用於使用AutoBeans)看起來像這樣:

// I'm leaving the setters out for brevity 
public interface PersonDTO { 
    @PropertyName(value="FirstName") 
    String getFirstName(); 
    @PropertyName(value="LastName") 
    String getLastName(); 
    @PropertyName(value="Age") 
    Integer getAge(); 
    @PropertyName(value="Details") 
    List<Details> getDetails(); 
} 

public interface Details { 
    @PropertyName(value="Address") 
    String getAddress(); 
    @PropertyName(value="City") 
    String getCity(); 
    @PropertyName(value="ZipCode") 
    String getZipCode(); 
} 

假設它映射到您正在使用的接口模型(或接近它),然後回答您的問題,@Path註釋用於指定訪問屬性(而不是JSON名稱)的對象屬性名稱。因此,對於單個屬性,如果您的PropertyAccess值與該屬性的名稱不同,則可以使用路徑註釋。在你的榜樣,你的PersonProperties屬性都大寫,所以你可以使用這樣的事情:

@Path("firstName") 
ValueProvider<PersonDTO, String> FirstName(); 

如果您的詳細信息對象只是一個單一的對象,那麼你可以使用類似的符號給你寫的東西(記得@Path註釋含蓄指定干將使用從對象墊片訪問屬性):

@Path("details.address") 
ValueProvider<PersonDTO, String> address(); 
// would return the address if Details was a single object 

不過,具體細節值作爲你的JSON例子有點不同表明Details值實際上的Details的集合。因此,您的網格將不知道如何顯示細節,因爲每個PersonDTO對象都有多個Details對象。但是我猜測你已經清楚了,所以讓我們假設你在某些條件適用時試圖在給定行中顯示一個地址。在這種情況下,您可以實現您自己的ValueProvider。

public class AddressByCityValueProvider implements ValueProvider<PersonDTO, String> { 
    public final String cityKey; 

    public AddressByCityValueProvider(String specifiedKey) { 
    this.cityKey = specifiedKey; 
    } 

    // we will display their Address if the city is Boston 
    @Override 
    public String getValue(PersonDTO person) { 
    if (null != person.getDetails()) { 
     for (Details detail : person.getDetails()) { 
     if (detail.getCity().equalsIgnoreCase(cityKey)) { 
      return detail.getAddress(); 
     } 
     } 
    } 
    return ""; // no address for specified city in object, return a blank String 
    } 

    @Override 
    public String getPath() { 
    return key; 
    } 

然後你在哪裏使用ValueProvider從PropertyAccess類,你會替換自己ValueProvider並指定要使用的關鍵在於:例如(從煎茶的例子,我覺得dervied)。對於列配置,你可以使用這個ValueProvider返回街道地址時,城市是波士頓:

ColumnConfig<PersonDTO, String> addressColumn = 
    new ColumConfig<PersonDTO, String>(new AddressByCityValueProvider("Boston"), 100, "Address"); 

顯然,這只是一個例子,但希望你的想法。

+0

我想我已經明白了。感謝您的建議,謝謝! – ladinho10