我确定这是一个相当简单的问题,但我知道如何优雅地解决它(案例陈述听起来不像是最具扩展性的选项)。
我必须转换并填充一种类型的地址数据,并将其打包为不同类型的Web服务。不幸的是,类型不对齐,我将不得不以某种方式映射这两种类型。
例如,我的AddressData
包含String AddressLine1
,String 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);
}
任何有关如何实施此实施的帮助都会很棒。非常感谢你。
答案 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);