1

クラス間のマッピングに dozer 4.1 を使用しようとしています。次のようなソース クラスがあります。

    public class initRequest{
     protected String id;
     protected String[] details
}

次のような宛先クラスがあります。

public class initResponse{
       protected String id;
       protected DetailsObject detObj;
}

public class DetailsObject{
 protected List<String>  details;
}

したがって、基本的に、詳細配列の文字列を Details オブジェクトの List に入力する必要があります。

私はこのようなマッピングを試みました:

<mapping wildcard="true" >
  <class-a>initRequest</class-a>
  <class-b>initResponse</class-b>   
  <field>
    <a is-accessible="true">details</a>
    <b is-accessible="true">detObj.details</b>
  </field>
</mapping>

しかし、私はこのエラーが発生します:

Exception in thread "main" net.sf.dozer.util.mapping.MappingException: java.lang.NoSuchFieldException: detObj.details
    at net.sf.dozer.util.mapping.util.MappingUtils.throwMappingException(MappingUtils.java:91)
    at net.sf.dozer.util.mapping.propertydescriptor.FieldPropertyDescriptor.<init>(FieldPropertyDescriptor.java:43)
    at net.sf.dozer.util.mapping.propertydescriptor.PropertyDescriptorFactory.getPropertyDescriptor(PropertyDescriptorFactory.java:53)
    at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestPropertyDescriptor(FieldMap.java:370)
    at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestFieldType(FieldMap.java:103)
    at net.sf.dozer.util.mapping.util.MappingsParser.processMappings(MappingsParser.java:95)
    at net.sf.dozer.util.mapping.util.CustomMappingsLoader.load(CustomMappingsLoader.java:77)
    at net.sf.dozer.util.mapping.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:149)
    at net.sf.dozer.util.mapping.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:132)
    at net.sf.dozer.util.mapping.DozerBeanMapper.map(DozerBeanMapper.java:94)

これが機能するようにマップするにはどうすればよいですか?

4

7 に答える 7

3

これは私にとってはうまくいきます。5.2.1 バージョンを使用しています

 <mapping wildcard="true" >
      <class-a>initRequest</class-a>
      <class-b>initResponse</class-b>   
      <field>
        <a>details</a>
        <b is-accessible="true">detObj.details</b>
      </field>
    </mapping>

には「is-accessable」は必要ないことに注意してください。それが役に立てば幸い

于 2012-12-08T07:20:19.093 に答える
2

問題が解決しました...

  • is-accesibleを使用すると、アクセス修飾子やゲッター/セッターの存在に関係なくオブジェクトを更新できます(JAXBを使用して生成されたオブジェクトに必須)

  • ディープマッピングの「ドット」表記は、ネストされたオブジェクトにアクセスするために機能します

この2つを組み合わせると、Dozerでは機能しません(新しいバージョンでは機能する可能性があります)

解決策...ディープマッピングが不要になるようにxsdを変更します。これは私の理想的な解決策ではありませんが、すべてのオブジェクトに対してカスタムコンバーターを作成するよりも優れています

于 2010-06-17T14:41:07.080 に答える
1

JaxB の場合、セッターを生成するためのプラグインをダウンロードして使用できます。詳細については、https://jaxb2-commons.dev.java.net/collection-setter-injector/のリンクを参照してください。

于 2010-10-16T14:06:01.193 に答える
0
<b is-accessible="true">detObj.details</b>

に置き換える必要があります

<b is-accessible="true">DetailsObject.details</b>
于 2011-02-16T11:41:15.780 に答える
0

要約すると、この問題には次のオプションがあります。1) Naveen で説明されているように、JaxB プラグインを使用してセッターを有効にします。2) そのようなプロパティには is-accessible を使用します。

最初のアプローチを使用すると、コレクション/リストのセッターがnullで設定されるリスクがあるため、不必要に公開されると思います。

副作用を避けるために、(クラス全体ではなく) そのようなフィールドに対して is-accessible を有効にすることにしました。

Dozer Mapping Class level is-accessibleでソリューションについて説明しました

于 2015-08-03T06:23:58.063 に答える
0

アクセサー (ゲッター/セッター) が欠落していると思います。ちなみに、Dozer がインスタンス化できるように、DetailsObject の空のコンストラクターも提供する必要があると思います。

于 2010-06-10T21:01:53.403 に答える