cancel
Showing results for 
Search instead for 
Did you mean: 

Reverse Converters and Dynamic Attributes Issue

Former Member
0 Kudos

Hi all, I found out a problem using reverse converters, more specifically the off-the-shelf AddressReverseConverter; it seems that dynamic attributes are never populated.

After a lot of debugging, maybe I found out the reason. When calling addressReverseConverter.convert(AddressData addressData), the target AddressModel is instantiated with a "new", not by calling "modelService.create()". This means that the model is not attached to the serviceLayer, and no dynamic attribute handler is effective.

I have attached a simple integration test that explains the problem.

The first test case fails because an addressModel is generated by the converter. The static fields (firstname, lastname) are correctly populated, while the dynamic ones (line1, line2) are not.

The second test case fails for the same reason: addressModel is created by constructor.

The third test case succeeds: addressModel is created through the modelService, and both static and dynamic fields are populated correctly.

I worked the problem around by using the third approach, skipping the converter and using directly the populator. But I am wondering why a bug like that has not been detected and solved before.

 package de.hybris.platform.converters;
 
 import static org.junit.Assert.assertNotNull;
 
 import de.hybris.bootstrap.annotations.IntegrationTest;
 import de.hybris.platform.commercefacades.user.converters.populator.AddressReversePopulator;
 import de.hybris.platform.commercefacades.user.data.AddressData;
 import de.hybris.platform.converters.impl.AbstractPopulatingConverter;
 import de.hybris.platform.core.model.user.AddressModel;
 import de.hybris.platform.servicelayer.ServicelayerTransactionalTest;
 import de.hybris.platform.servicelayer.model.ModelService;
 
 import javax.annotation.Resource;
 
 import org.junit.Before;
 import org.junit.Test;
 
 
 @IntegrationTest
 public class AddressReverseConverterIntegrationTest extends ServicelayerTransactionalTest
 {
     @Resource
     private ModelService modelService;
 
     @Resource
     private AbstractPopulatingConverter<AddressData, AddressModel> addressReverseConverter;
 
     @Resource
     private AddressReversePopulator addressReversePopulator;
 
     private AddressData addressData;
 
     @Before
     public void setup()
     {
         addressData = new AddressData();
         addressData.setFirstName("John");
         addressData.setLastName("Doe");
         addressData.setLine1("Fake road");
         addressData.setLine2("1");
     }
 
     @Test
     public void testReverseConverter()
     {
         final AddressModel addressModel = addressReverseConverter.convert(addressData);
 
         assertNotNull(addressModel.getFirstname());
         assertNotNull(addressModel.getLastname());
 
         assertNotNull(addressModel.getLine1());
         assertNotNull(addressModel.getLine2());
         assertNotNull(addressModel.getStreetname());
         assertNotNull(addressModel.getStreetnumber());
     }
 
     @Test
     public void testReversePopulatorNew()
     {
         final AddressModel addressModel = new AddressModel();
         addressReversePopulator.populate(addressData, addressModel);
 
         assertNotNull(addressModel.getFirstname());
         assertNotNull(addressModel.getLastname());
 
         assertNotNull(addressModel.getLine1());
         assertNotNull(addressModel.getLine2());
         assertNotNull(addressModel.getStreetname());
         assertNotNull(addressModel.getStreetnumber());
     }
 
     @Test
     public void testReversePopulatorCreate()
     {
         final AddressModel addressModel = modelService.create(AddressModel.class);
         addressReversePopulator.populate(addressData, addressModel);
 
         assertNotNull(addressModel.getFirstname());
         assertNotNull(addressModel.getLastname());
 
         assertNotNull(addressModel.getLine1());
         assertNotNull(addressModel.getLine2());
         assertNotNull(addressModel.getStreetname());
         assertNotNull(addressModel.getStreetnumber());
     }
 
     /**
      * @param modelService
      *           the modelService to set
      */
     public void setModelService(final ModelService modelService)
     {
         this.modelService = modelService;
     }
 
     /**
      * @param addressReverseConverter
      *           the addressReverseConverter to set
      */
     public void setAddressReverseConverter(final AbstractPopulatingConverter<AddressData, AddressModel> addressReverseConverter)
     {
         this.addressReverseConverter = addressReverseConverter;
     }
 
     /**
      * @param addressReversePopulator
      *           the addressReversePopulator to set
      */
     public void setAddressReversePopulator(final AddressReversePopulator addressReversePopulator)
     {
         this.addressReversePopulator = addressReversePopulator;
     }
 }
 

Accepted Solutions (0)

Answers (1)

Answers (1)

Former Member
0 Kudos

Just run into this issue and its a shame it's not solved yet.