2017-03-20 7 views
0

POST Aufruf verwendet Eigenschaft Variablennamen anstelle von @XmlElement (Name)@XmlAccessorType (XmlAccessType.FIELD) Abbilden nicht mit @XmlElement

DTO:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "balance", 
    "companyName", 
    ... 

@XmlRootElement(name = "CustomerDTO", namespace = "") 
public class CustomerDTO { 

    @XmlElement(namespace = "", required = true) 
    protected String balance; 
    @XmlElement(name = "company_name", namespace = "", required = true) 
    protected String companyName; 

POST Aufruf:

HttpEntity<CustomerDTO> entity = new HttpEntity(customerDTO, headers); 
String result = restTemplate.postForObject(URL, entity, String.class); 

Das Problem ist, dass endgültige JSON als companyName i erstellt wird tatt company_name

+1

ein Grund, warum Sie mit XML-Tags für JSON-Daten ging? – Coder

+0

Nach etwas Graben haben Sie möglicherweise einen Konflikt zwischen den Tags, die Sie haben. In Ihrem propOrder haben Sie 'companyName'. Ersetzen Sie das durch 'company_name' – Coder

+0

@Coder: Keine. Es ist nur eine blöde Convention, die wir in unserem Projekt verfolgen !!! Ersetzen ist nicht gerade eine Option, da der DTO durch ein Skript generiert wird. –

Antwort

0

Marshall und un-marshall der DTO:

private String marshallTOJSON(CustomerDTO customerDTO) throws JAXBException { 
     System.setProperty("javax.xml.bind.context.factory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); 
     JAXBContext context = JSONJAXBContext.newInstance(CustomerDTO.class); 
     Marshaller marshaller = context.createMarshaller(); 
     JSONMarshaller jsonMarshaller = JSONJAXBContext.getJSONMarshaller(marshaller, context); 
     jsonMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     StringWriter writer = new StringWriter(); 
     jsonMarshaller.marshallToJSON(customerDTO, writer); 
     return writer.toString(); 
    } 
1

@XmlElement ändert die Feldnamen für XML-Anforderung und nicht für json, Wenn Sie die Variable für JSON umbenennen möchten, dann sollten Sie @JsonProperty ("Name")

For e.g: 
public class Test { 
    @JsonProperty("first_name") 
    public String firstName; 
    @JsonProperty("last_name") 
    public String lastName; 
} 
verwenden

o/p für json wird

"Test":{ 
    "first_name":"Parameter-Name", 
    "last_name":"Parameter-Value" 
} 
+0

Keine Option für mich, da ich DTO nicht ändern kann (es wird automatisch durch ein Skript generiert). –

Verwandte Themen