2010-10-19 23 views
9

Tengo un POJO que necesito formatear como MultiValueMap. Este MultiValueMap se utilizará como solicitud en un método POST utilizando la clase restTemplate y se transferirá a mi servicio web como contentType application/x-www-form-urlencoded.POJO a MultiValueMap mapeo/encuadernación/conversión en la primavera 3

¿Hay alguna herramienta o utilidad que haga la conversión POJO -> MultiValueMap para mí?

muestra 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; 
    } 
} 

Después MultiValueMap se convierte en contentType: application/x-www-form-urlencoded llamando Publicar en restTemplate objeto:

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

muestra el pojo y el mapa que esperas. – Bozho

+1

agregó algunas muestras de código para demostrar la pregunta. – tia

+0

Usted ya hizo esta pregunta: http://stackoverflow.com/questions/3928163/spring-resttemplate-post-parameters-from-complex-object – skaffman

Respuesta

0

Usted puede hacer esto con la reflexión y/o introspección (nunca recuerdo el nombre correcto). Esta es una variación de la serialización, por lo que es posible que desee consultar la implementación de serialización.

Otra opción es crear una interfaz similar a esta

 

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

Y implementarlo en las clases en cuestión.

Para su POJO que podría tener este aspecto:

 

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

Si usted está buscando para enviar en el formato que ha especificado en su pregunta, entonces es posible que desee hacer algo parecido a lo que DwB sugerido, sin embargo Creo que puede resultar más fácil de convertir si utiliza un enfoque más orientado a objetos como JSON, hay muchas bibliotecas para convertir POJO-> JSON. Otra ventaja es que JSON maneja las tiendas numbers/string/booleans por separado, por lo tanto es más fácil volver a convertirlo en POJO, mientras que si envía los datos como en su ejemplo, deberá convertir todos los objetos String en el tipo que son, p. id tendrá que convertirse String-> int y active converted String-> boolean.

Así que en JSON que puede ser algo como esto:

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

Obviamente se podría hacer algo similar con XML, pero me gusta esta solución simple cuando quiero enviar datos de forma sencilla y todo en una línea. Las bibliotecas JSON están mejorando y algunas pueden generar esto de su objeto por reflexión.

De todos modos solo una sugerencia.

Cuestiones relacionadas