0

可変数の列を持つグリッドを作成しています。ほぼ完了しましたが、残っているのは 1 つだけです... 属性 Address (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 からプロパティにアクセスするために使用するゲッターを暗黙的に指定していることを思い出してください)。

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

Detailsただし、JSON の例では、値が実際には のコレクションであることを示しているため、 Details の値は少し異なりますDetails。その結果、すべての PersonDTO オブジェクトに対して複数の Details オブジェクトが存在するため、グリッドは詳細を表示する方法を認識できません。しかし、それはすでに明らかだと思いますので、特定の条件が適用されるときに、特定の行に住所を表示しようとしていると仮定しましょう。そのような場合、独自の 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 に答える