【问题标题】:How to map properties of two different classes in Java如何在 Java 中映射两个不同类的属性
【发布时间】:2015-05-06 13:22:09
【问题描述】:

我确信这是一个相当简单的问题,但对于如何优雅地解决它我束手无策(case 语句听起来不像是最具可扩展性的选项)。

我必须转换和填充一种类型的地址数据,并将其打包用于不同类型的 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);
        }

任何有关执行此实现的方法的帮助都会很棒。非常感谢。

【问题讨论】:

  • 有什么原因不能使用Map<String, StateProvinceCode>
  • 另外,使用 equals() 方法比较字符串值。 @见stackoverflow.com/questions/513832/…
  • @KevinKrumwiede - 我可以,但我的问题是如何使用预先填充的地图?我如何/在哪里可以声明而不是在地图中单独设置状态。我希望这是有道理的。
  • 要填充地图,请检查 SnakeYaml。 Spring 有一些框架支持,它是一种在启动时迭代静态数据的简单方法。

标签: java spring dictionary populate


【解决方案1】:

您考虑过使用 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);

【讨论】:

    【解决方案2】:

    我认为您要问的是在字符串和您已创建或正在使用的称为“StateProvinceCode”的对象之间创建关系。如果是这种情况,您可以使用凯文建议的“地图”。我喜欢使用 HashMap,因为它们更容易处理:

    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 作为例子,你可以这样构造你的 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);
        }
    }
    

    以上内容可能并不完美,因为这里已经很晚了,所以很抱歉。您可能需要使用一点魔法才能使其正常工作。如果您遇到更多问题,请告诉我。

    【讨论】:

    • 是的,完全正确!如何使用所有状态字符串和相应的 StateProvinceCodes 填充 HashMap?我可以用 Spring util:map 做到这一点吗?另外,我可以通过这种方式从 StateProvinceCode 获取字符串吗?对于我对 Java 还是很陌生的菜鸟问题,我深表歉意。
    • 我已经用其他详细信息编辑了我的答案。希望对您有所帮助。
    • 这很有帮助!谢谢你。有没有办法像通过spring配置文件一样提前声明这个地图?在我的方法中添加超过 50 多个映射似乎有点极端。谢谢!
    • 添加了更多说明。
    • @user1615559 听起来像是 static initializer 的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多