Mapping deep properties with intermediate collections in dozer

前端 未结 3 1700
一个人的身影
一个人的身影 2021-02-09 16:29

Suppose I have the following classes

public class Baz {
  private List foos = new ArrayList();
}

public class Foo {
  private String strin         


        
相关标签:
3条回答
  • 2021-02-09 17:12

    I think, you can write such a mapping

    <mapping>
      <class-a>Baz</class-a>
      <class-b>Target</class-b>
      <field>
        <a>foos</a>
        <b>fooStrings</b>
      </field>
    </mapping>
    
    <custom-converters> 
      <converter type="CustomFooConverter">
        <class-a>
          Foo
        </class-a>
        <class-b>
          String
        </class-b>
      </converter>
    </custom-converters>
    

    And implement CustomFooConverter to get string field of foo and return it as a String.

    I think you can post a feature request to support mapping to primitives as

    <mapping>
      <class-a>Foo</class-a>
      <class-b>String</class-b>
      <field>
        <a>string</a>
      </field>
    </mapping>
    

    into Dozer GitHub

    0 讨论(0)
  • 2021-02-09 17:20

    You could always write your own CustomConverter.

    It makes sense why Dozer isn't able to handle this as you expect since at runtime it has no type information about the List foos and can't guarantee that every Object in the list is actually a Foo.

    0 讨论(0)
  • 2021-02-09 17:26

    I think you can do it without custom converter.

    Override the toString() method of Foo class like below:

    @Override
    public String toString(){
    return this.getString(); //assuming string property has a getter method. if not,write this.string
    

    And now the follwing mapping:

    <mapping>
    <class-a>fully qualified name of Baz(with package name)</class-a>
    <class-b>same for Target</class-b>
    <field>
       <a>foos</a>
       <b>fooStrings</b>
       <a-hint>foo</a-hint>
       <b-hint>java.lang.String</b-hint>
    </field>
    </mapping>
    
    0 讨论(0)
提交回复
热议问题