如何在Java中映射两个不同类的属性

时间:2015-03-05 08:39:04

标签: java spring dictionary populate

我确定这是一个相当简单的问题,但我知道如何优雅地解决它(案例陈述听起来不像是最具扩展性的选项)。

我必须转换并填充一种类型的地址数据,并将其打包为不同类型的Web服务。不幸的是,类型不对齐,我将不得不以某种方式映射这两种类型。

例如,我的AddressData包含String AddressLine1String State等等...需要填充的另一个类Address需要特定的" StateProviceCode"而不是状态的字符串。如何将String映射到特定的StateProviceCode,以便我可以运行地图并注入正确的状态代码?

如果这没有多大意义,我会尝试做类似以下的事情:

    Address billingAddress = new Address(); //to be populated
    AddressData billingAddressData = updateStoredCardRequest.getPaymentInfo().getBillingAddress();

    billingAddress.setAddressLine1(billingAddressData.getLine1()); //String->String
    billingAddress.setCity(billingAddressData.getTown()); //String->String
    billingAddress.setPostalCode(billingAddressData.getPostalCode()); //String->String

    //based on the isocode of the billingAddressData.region, set the stateProviceCode of the billingAddress.
    if(billingAddressData.getRegion().getIsocodeShort() == "US-IL"){
        billingAddress.setStateProvinceCode(StateProvinceCode.Illinois);
        }

任何有关如何实施此实施的帮助都会很棒。非常感谢你。

2 个答案:

答案 0 :(得分:2)

我认为您要问的是在String和您创建或正在使用的对象之间建立一种关系,称为" StateProvinceCode"。如果是这种情况,您可以使用" Map"像Kevin建议的那样。我喜欢使用HashMaps,因为它们更容易处理:

HashMap<String, StateProvinceCode> map = new HashMap<String, StateProvinceCode>();

您可以按如下方式使用HashMap:

map.put("Illinois", StateProvinceCode.Illinois);  


for(Map.Entry m : map.entrySet()){  
    System.out.println(m.getKey() + " " + m.getValue());  
}  

为了填充你的HashMap,我不是Spring的专家,所以也许有人可以给你一个比这更好的答案,但你总是可以使用一个循环。如果你有一个List of each作为例子,你可以用这种方式构建你的HashMap:

List<StateProvinceCode> stateProvinceCodes = new ArrayList<StateProvinceCode>();
List<String> stringsForStateProvinceCodes = new ArrayList<String>();

for( StateProvinceCode spc : stateProvinceCodes ) {
    for( String s : stringsForStateProvinceCodes ) {
        map.put(s, spc);
    }
}

上述情况可能并不完美,因为在这里很晚,所以道歉。您可能需要尝试一点魔法才能使其正常工作。如果您遇到更多问题,请告诉我。

答案 1 :(得分:0)

您考虑过使用PropertyMap吗?

所以你必须做这样的事情 -

class AddressMapper extends PropertyMap<AddressData, Address> {

   @Override
   protected void configure(){

     map().setAddressLine1(source.getLine1());
     map().setCity(source.getTown());

   }
}

//Define ModelMapper class in your configuration
    @Bean
    public ModelMapper modelMapper(){
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.addMappings(new AddressMapper());
        return modelMapper;
    }

之后,你只需要调用ModerMapper的map方法 -

@Autowired
ModelMapper modelMapper;

modelMapper.map(<AddressData object goes here>, Address.class);
相关问题