2015-03-05 3 views
2

Я уверен, что это довольно простой вопрос, но я нахожусь в стороне от того, как его изящно решить (оператор case не похож на наиболее масштабируемый вариант).Как сопоставить свойства двух разных классов в Java

Мне нужно преобразовать и заполнить адресные данные одного типа и упаковать его для веб-службы, имеющей другой тип. К сожалению, типы не выравниваются, и мне придется как-то отобразить их.

Например, у меня есть 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); 
     } 

Любая помощь на пути сделать это осуществление было бы здорово. Огромное спасибо.

+5

Есть причина, вы не можете используйте «Map »? –

+2

Кроме того, используйте метод equals() для сравнения строкового значения. @see http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java – owenrb

+0

@KevinKrumwiede - Я могу, но мой вопрос в том, как у меня есть предварительно заполненная карта для использования? Как/Где я могу объявить это, а не устанавливать состояния отдельно на Карте. Я надеюсь, что в этом есть смысл. – user1615559

ответ

2

Я думаю, что вы просите создать связь между String и объектом, который вы создали или используете, называемым «StateProvinceCode». Если это так, вы можете использовать «карту», ​​как предположил Кевин. Мне нравится использовать 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, я не эксперт Спринг , так что, возможно, кто-то может дать вам лучший ответ, чем этот, но вы всегда можете просто использовать цикл. Если у вас есть список каждого в качестве примера, вы можете построить свой 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); 
    } 
} 

выше, является, вероятно, не является совершенным, потому что это очень поздно здесь, так извинениями. Возможно, вам понадобится немного магия, чтобы заставить ее работать правильно. Дайте мне знать, если у вас возникнут проблемы.

+0

Да, точно! Как заполнить HashMap всеми Строками состояний и соответствующими StateProvinceCodes? Могу ли я сделать это с помощью Spring util: map? Кроме того, могу ли я получить String из StateProvinceCode таким образом? Я прошу прощения за вопросы новобранец, я все еще довольно новичок в Java. – user1615559

+0

Я отредактировал свой ответ с дополнительной информацией. Надеюсь, это поможет. – Reapz

+0

Это помогает! Спасибо. Есть ли способ, которым я могу объявить эту карту раньше времени, например, через файл конфигурации пружины? Добавление более 50 + отображений в моем методе кажется немного экстремальным. Спасибо! – user1615559

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 -

@Autowired 
ModelMapper modelMapper; 

modelMapper.map(<AddressData object goes here>, Address.class); 
Смежные вопросы