Dispenser sorting field type = "one-sided" does not work properly

According to the Dozer documentation, one-way fields are only rendered when object "a" is matched against object "b". If "b" maps to "a" then the field is not displayed.

But for the code below, "b" is still mapped to "a".

 <mapping >
    <class-a>com.examples.source.Source</class-a>
    <class-b>com.examples.destination.Destination</class-b>
    <field type="one-way">
        <a set-method="setIRCCode" get-method="getIRCCode">ircCode</a>
        <b set-method="setIrcCode" get-method="getIrcCode">ircCode</b>
    </field> 
</mapping>

package com.examples.source;
public class Source {
    protected String ircCode;

    public String getIRCCode() {
        return ircCode;
    }
    public void setIRCCode(String value) {
        this.ircCode = value;
    }
}

package com.examples.destination;
public class Destination {
    private String ircCode;
    public String getIrcCode() {
        return this.ircCode;
    }
    public void setIrcCode(String ircCode) {
        this.ircCode = ircCode;
    }
}

public class Mapping {
    public static void main(String[] args) {
      DozerBeanMapper mapper = new DozerBeanMapper(Arrays.asList(new String[]{"Dozer-Mapping.xml"}));
      Destination destinationObj=new Destination();
      destinationObj.setIrcCode("B");
      Source srcObj= mapper.map(destinationObj, Source.class);
      System.out.println("Reverse Mapping IRCCode= "+ srcObj.getIRCCode());
   }
}

      

Output when running the above code:

Reverse Mapping IRCCode= B **(Unexpected and Wrong Result)**

      

Expected Result:

Reverse Mapping IRCCode= null

      

I am using Dozer 5.4.0 version.

+3


source to share


1 answer


I tried the below code similar to your post with 5.5.1 from Dozer and it provides the expected result as null .

code:

public class A {

    private String aName;
    private String aPlace;
    /**
     * @return the aName
     */
    public String getaName() {
        return aName;
    }
    /**
     * @param aName the aName to set
     */
    public void setaName(String aName) {
        this.aName = aName;
    }
    /**
     * @return the aPlace
     */
    public String getaPlace() {
        return aPlace;
    }
    /**
     * @param aPlace the aPlace to set
     */
    public void setaPlace(String aPlace) {
        this.aPlace = aPlace;
    }

}

public class B {
    private String bName;
    private String bPlace;
    /**
     * @return the bName
     */
    public String getbName() {
        return bName;
    }
    /**
     * @param bName the bName to set
     */
    public void setbName(String bName) {
        this.bName = bName;
    }
    /**
     * @return the bPlace
     */
    public String getbPlace() {
        return bPlace;
    }
    /**
     * @param bPlace the bPlace to set
     */
    public void setbPlace(String bPlace) {
        this.bPlace = bPlace;
    }
}

      

bulldozer-display:

  <mapping> 
    <class-a>com.test.A</class-a>
    <class-b>com.test.B</class-b>   
    <field type="one-way">
      <a>aName</a>
      <b>bName</b>
    </field>
  </mapping>  

      



Test:

public static void main(String[] arg){
    List<String> myMappingFiles = new ArrayList<String>(1);
    myMappingFiles.add("dozer-mapping.xml");

    DozerBeanMapper mapper = new DozerBeanMapper();
    mapper.setMappingFiles(myMappingFiles);
    B obj=new B();
    obj.setbName("Test");
    A destObject = 
        mapper.map(obj, A.class);
              System.out.println("B="+destObject.getaName());
}

      

Output:


SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
B=null

      

0


source







All Articles