2012-12-28 27 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