0

我正在创建一个列数可变的网格。我几乎完成了,但只剩下一件事......我无法访问属性地址(PersonProperties 接口)。我不知道如何正确编写@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();

}

4

1 回答 1

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();

如果您的 Details 对象只是一个对象,那么您可以使用与您编写的类似的表示法(请记住,@Path注释隐含指定用于从对象 shim 访问属性的 getter):

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

但是,详细信息值略有不同,因为您的 JSON 示例表明这些Details值实际上是Details. 因此,您的网格将不知道如何显示详细信息,因为每个 PersonDTO 对象都有多个详细信息对象。但我猜你已经很清楚了,所以让我们假设你在某些条件适用时试图在给定的行中显示一个地址。在这种情况下,您可以实现自己的 ValueProvider。例如(来自我认为的 Sencha 示例):

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;
  }

然后,在您使用 PropertyAccess 类中的 ValueProvider 的地方,您将替换您自己的 ValueProvider 并指定要使用的密钥。对于列配置,当城市为波士顿时,您可以使用此 ValueProvider 返回街道地址:

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

显然这只是一个例子,但希望你能明白这一点。

于 2012-12-28T13:59:44.067 回答