es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Respuesta XML incorrecta de Spring REST

Tengo un problema al generar la respuesta XML de mi bean.

Método del controlador:

@GetMapping(value = PING_URL, produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<pong> getPingPage() {
    ServicesType services = new ServicesType();
    services.getService().add(this.commonService.getDBSservice());

    final Pong pong = new Pong();
    pong.setVersion(this.commonService.getVersion());
    pong.setServices(services);
    pong.setStatus(this.commonService.getGlobalStatus(pong).name());
    return ResponseEntity.ok(pong);
}

Bean:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "status",
    "version",
    "services"
})
@XmlRootElement(name = "pong")
public class Pong {

    @XmlElement(required = true)
    protected String status;
    @XmlElement(required = true)
    protected String version;
    @XmlElement(required = true)
    protected ServicesType services;
    // GETTER / SETTER
}

Respuesta:

<pong>
    <status>OK</status>
    <version></version>
    <services>
        <service>
            <service>
                <status>OK</status>
                <log></log>
                <name>BDD</name>
            </service>
        </service>
    </services>
</pong>

Como puedes ver, XmlRootElement es “Pong” en lugar de “pong”, pero se ha ignorado.

¿Tienes alguna idea de cómo resolver el problema, por favor?

Estoy utilizando Spring (5.3.14) con Jackson (2.13.1).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la sensibilidad de mayúsculas y minúsculas del nombre del elemento XML. Por defecto, Jackson utiliza el mismo nombre que la clase Java para el elemento raíz de la salida XML. Sin embargo, en este caso, el nombre deseado del elemento XML es “pong” en lugar de “Pong”. Para resolver este problema, puedes utilizar la anotación @JsonPropertyOrder para especificar el orden de las propiedades e incluir la anotación @JsonProperty para personalizar el nombre del elemento.

    Por ejemplo, en la clase Pong, puedes agregar las siguientes anotaciones:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {"status", "version", "services"})
    @XmlRootElement(name = "pong")
    @JsonPropertyOrder({"status", "version", "services"})
    public class Pong {
        @XmlElement(required = true)
        @JsonProperty("status")
        protected String status;
        @XmlElement(required = true)
        @JsonProperty("version")
        protected String version;
        @XmlElement(required = true)
        @JsonProperty("services")
        protected ServicesType services;
    
        // getters and setters
    }
    

    En este ejemplo, la anotación @JsonPropertyOrder se utiliza para especificar el orden de las propiedades en la salida XML. La anotación @JsonProperty se utiliza para personalizar el nombre del elemento.

    Con estos cambios, la respuesta XML debería tener ahora el nombre correcto del elemento raíz, “pong”.

Comments are closed.