2014-11-28 12 views
5

Pracuję nad projektem, w którym muszę mapować z hierarchicznego Map<String, Object>, gdzie drugi parametr ma być String lub Map<String, Object>. Do tej pory ModelMapper działał niesamowicie, ale mam problem z konkretną konwersją. Biorąc pod uwagę następujące, gdzie Model jest po prostu interfejs znacznik:Jak mapować z mapy na listę

class Client implements Model { 
    String firstName; 
    String lastName; 
    List<Organization> organizations = new ArrayList<>(); 
} 

Zakładając Organization implementuje mój interfejs markera Model ale jest inaczej dowolnie skonstruowane, chciałbym być w stanie przyporządkować następujące do Client:

Map source = new HashMap(){{ 
    put("firstName", "John"), 
    put("lastName", "Smith"), 
    put("organizations", new HashMap(){{ 
     put("0", new HashMap(){{ 
      put("id", "1234"); 
     }}); 
     put("abc", new HashMap(){{ 
      put("id", "5678"); 
     }}); 
    }}); 
}}; 

Podsumowując: w jaki sposób można uzyskać, aby modelMapper usuwał klucze map i korzystał z listy wartości tylko podczas przesyłania do usługi organizacji? W przeciwnym razie właściwość organizacji pojawia się pusta. Możesz założyć, że mam dobry powód, by chcieć to zrobić, i zły przykład!

Z góry dziękuję za wejście!

Edit

próbowałem zbudować Converter że będzie zarządzać konwersji z Map do Collection<Model> bezskutecznie. Biorąc pod uwagę:

new Converter<Map, Collection<DataTransportObject>>() { 
    @Override 
    public Set convert(MappingContext<Map, Collection<DataTransportObject>> context) { 
     LOG.debug("Here"); 
     Set<DataTransportObject> result = new HashSet<>(); 
     return result; 
    } 
} 

Istnieją dwa problemy z tym:

  1. Widocznie ModelMapper nie patrzy na dziedziczenia, dlatego kiedy każdy realizacja Map jest podane jako źródło, konwerter nie jest prowadzony. Jeśli na przykład zmieniam konwerter, aby zaakceptować HashMap i przekazać jako źródło, HashMap, to działa.
  2. context.getGenericDestinationType() zwraca klasy List lub Set bez informacji ogólnych. Jak zatem ModelMapper zdoła zbudować złożone wykresy modeli w normalnych warunkach?
+0

Wygląda na to, że pytasz o różne rzeczy w różnych częściach pytania. Czy chcesz przekonwertować mapę na instancję 'Client', czy chcesz ją przekonwertować na listę? – VGR

+0

Dana mapa powinna zostać przekonwertowana na instancję 'Client'. Ale w obecnej postaci ModelMapper nie obsłuży własności 'organizacji' i pozostawi ją pustą. Chcę, aby ModelMapper przesunął listę wartości map do właściwości 'organizacji'. – ironhardchaw

+0

Myślę, że potrzebujesz BeanUtils lub ObjectMapper. Możesz zobaczyć odpowiedź w [http://stackoverflow.com/questions/739689/how-to-convert-a-java-object-bean-to-key-value-pairs-and-vice-versa][ 1 ] [1]: http://stackoverflow.com/questions/739689/how-to-convert-a-java-object-bean-to-key-value-parairs-and-vice-versa –

Odpowiedz

0

W twoim przypadku myślę, że możesz użyć dodatkowego setera dla klasy Pojo. A następnie, aby przekonwertować mapę na obiekty, użyj bibliotek jako ObjectMapper/BeanUtils/.... Na przykład:

void setOranizations(Map<String, Organization> map) { 
    this.organizations = map.values(); 
} 
+0

Punktem tego pytania jest możliwość przesunięcia tej mapy do kolekcji jako listy wartości. Chodzi o to, że dostałem mapę hierarchiczną z dowolnymi kluczami i dowolnymi wartościami, i że muszę po prostu upuścić klawisze z mapy i użyć listy wartości. – ironhardchaw

+0

Być może możesz dodać do swojego modelu dodatkowego setera. Na przykład setOrganizations (mapa mapy) {this.organization = map.values}; –

+0

Nie mogę uwierzyć, że o tym nie pomyślałem! Nie jest to coś, co chciałbym, ale na pewno poprawne rozwiązanie. Próbowałem go z ModelMapper oprócz ObjectMapper i działa dla obu. Jeśli zmienisz swój komentarz w odpowiedź, zaznaczę go jako zaakceptowaną odpowiedź, ponieważ dotyczy to również pierwotnego pytania bez zmiany bibliotek. – ironhardchaw

Powiązane problemy