2010-10-19 10 views
9

Ho un POJO che ho bisogno di formattare come MultiValueMap. Questo MultiValueMap verrà utilizzato come richiesta in un metodo POST utilizzando la classe restTemplate e verrà passato al mio servizio Web come contentType application/x-www-form-urlencoded.Mappatura da POJO a MultiValueMap/binding/conversion in primavera 3

Esistono strumenti o utilità che faranno la conversione POJO -> MultiValueMap per me?

campione POJO:

public class SampleDto implements Serializable, Idable, Comparable<SampleDto> { 

    private static final long serialVersionUID = 1L; 

    private Integer id; 

    private Boolean active; 

    private String lastName; 

    private List<SurgeonClinicDto> surgeonClinics = new ArrayList<SurgeonClinicDto>(); 
    private List<PromptValueDto> promptValues = new ArrayList<PromptValueDto>(); 

    private Date lastUpdated = new Date(); 

    public SampleDto() { 

    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public Boolean getActive() { 
     return active; 
    } 

    public void setActive(Boolean active) { 
     this.active = active; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public Date getLastUpdated() { 
     return lastUpdated; 
    } 

    public void setLastUpdated(Date lastUpdated) { 
     this.lastUpdated = lastUpdated; 
    } 

    public List<SurgeonClinicDto> getSurgeonClinics() { 
     return surgeonClinics; 
    } 

    public void setSurgeonClinics(List<SurgeonClinicDto> surgeonClinics) { 
     this.surgeonClinics = surgeonClinics; 
    } 

    public List<PromptValueDto> getPromptValues() { 
     return promptValues; 
    } 

    public void setPromptValues(List<PromptValueDto> promptValues) { 
     this.promptValues = promptValues; 
    } 

    public int compareTo(SampleDto o) { 

     if (getLastName() != null && o.getLastName() != null 
       && getLastName().compareTo(o.getLastName()) != 0) { 
      return getLastName().compareTo(o.getLastName()); 
     } 
     if (getActive() != null && o.getActive() != null 
       && getActive().compareTo(o.getActive()) != 0) { 
      return getActive().compareTo(o.getActive()); 
     } 
     if (getLastUpdated() != null && o.getLastUpdated() != null 
       && getLastUpdated().compareTo(o.getLastUpdated()) != 0) { 
      return getLastUpdated().compareTo(o.getLastUpdated()); 
     } 
     if (getId() != null && o.getId() != null 
       && getId().compareTo(o.getId()) != 0) { 
      return getId().compareTo(o.getId()); 
     } 

     return 0; 
    } 
} 

Dopo MultiValueMap viene convertito in contentType: application/x-www-form-urlencoded chiamando POST su restTemplate oggetto:

id=11752&active=true&lastName=Brownie& 
promptValues[0].id=12&promptValues[0].miscPromptId=882&promptValues[0].value=meFirst& 
promptValues[1].id=13&promptValues[1].miscPromptId=881&promptValues[1].value=youToo& 
surgeonClinics[0].address1=newAddress&surgeonClinics[0].address2=newAddress2&surgeonClinics[0].city=clinic City& 
surgeonClinics[0][email protected]&surgeonClinics[0].fax=123.456.7890&surgeonClinics[0].id=33273& 
surgeonClinics[0].name=clinic name&surgeonClinics[0].phone=890-098-4567& 
surgeonClinics[0].zip=34567&surgeonClinics[0].surgeryCenter1=MySurgeryCenter1& 
surgeonClinics[0].surgeryCenter2=MySurgeryCenter2& 
surgeonClinics[1].address1=newAddress11&surgeonClinics[1].address2=newAddress22&surgeonClinics[1].city=clinic2 City& 
surgeonClinics[1][email protected]&surgeonClinics[1].fax=123.456.7890&surgeonClinics[1].id=33274& 
surgeonClinics[1].name=clinic2 name&surgeonClinics[1].phone=890-098-4567& 
surgeonClinics[1].zip=34567& 
surgeonClinics[1].surgeryCenter1=MySurgeryCenter21&surgeonClinics[1].surgeryCenter2=MySurgeryCenter22 
+1

mostra il pojo e la mappa che ti aspetti. – Bozho

+1

aggiunto alcuni esempi di codice per dimostrare la domanda. – tia

+0

Hai già fatto questa domanda: http://stackoverflow.com/questions/3928163/spring-resttemplate-post-parameters-from-complex-object – skaffman

risposta

0

Si può fare questo con la riflessione e/o introspezione (non ricordo mai il nome corretto). Questa è una variante della serializzazione, quindi potresti voler esaminare l'implementazione della serializzazione.

Un'altra opzione è quella di creare un'interfaccia simile a questo

 

putlic interface ToMap 
{ 
    Map<String, String> toMap(); 
} 

E implementarlo sulle classi in questione.

Per la vostra POJO potrebbe assomigliare a questo:

 

Map<String, String> toMap() 
{ 
    int index; 
    StringBuilder key = new StringBuidler(); 
    Map<String, String> returnValue = new HashMap<String, String>(); 

    returnValue.put("id", id); 
    returnValue.put("active", active); 
    returnValue.put("lastName", lastName); 

    index = 0; 
    for (SurgeonClinicDto surgeonClinic : surgeonClinics) 
    { 
     key.setLength(0); 
     key.append("surgeonClinic["); 
     key.append(index); 
     key.append("].field1"); 

     returnValue.put(key.toString(), surgeonClinic[index].field1); 

     key.setLength(0); 
     key.append("surgeonClinic["); 
     key.append(index); 
     key.append("].field2"); 

     returnValue.put(key.toString(), surgeonClinic[index].field2); 

     ... more stuff here... 

    } 
    return returnValue; 
} 
 
0

Se siete alla ricerca di inviare nel formato che avete specificato nella domanda allora si può decidere di fare qualcosa di simile a ciò che DwB suggerito, tuttavia Penso che potresti trovare più facile convertire se usi un approccio più orientato agli oggetti come JSON, ci sono molte librerie da convertire tra POJO-> JSON. Un altro vantaggio è che JSON gestisce separatamente i numeri store/string/booleans, quindi è più facile riconvertire in POJO, mentre se si inviano i dati come nell'esempio sarà necessario riconvertire tutti gli oggetti String in quale tipo sono, ad es. id dovrà essere convertito String-> int e active convertito String-> booleano.

Quindi, in JSON Può essere simile a questa:

dto = { 
    id : 11752, 
    active : true, 
    lastName : "Brownie", 
    promptValues : [ 
     {id : 12, miscPromptId : 882, value : "meFirst"}, 
     {id : 13, miscPromptId : 881, value : "youToo"} 
    ], 
    surgeonClinics = [{..etc..}] 
} 

Ovviamente si potrebbe fare qualcosa di simile con XML, ma mi piace questa semplice soluzione quando voglio inviare i dati in modo semplice e tutto in una sola riga. Le librerie JSON stanno migliorando e alcune possono praticamente generare questo dal tuo oggetto per riflessione.

Ad ogni modo solo un suggerimento.

Problemi correlati