Preloader image

Este es un ejemplo de como configurar en TomEE 7.x o posterior el proveedor antiguo de JSON, Jettison, usado por TomEE 1.7.x.

Este escenario es útil cuando las aplicaciones REST son migradas de TomEE 1.7.x hacia TomEE 7.x o posterior y se desea continuar con la antigua salida JSON de Jettison 1.3.7.

Corre las pruebas

Este ejemplo contiene 2 casos de prueba, uno usando Jettison y otro sin él para fines comparativos.

mvn clean test

Habilitación de Jettison como proveedor JSON

Debe proporcionar los siguientes 2 archivos en su carpeta WEB-INF:

  • openejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1">
    <pojo-deployment class-name="org.superbiz.JAXRSApplication">
        <properties>
            cxf.jaxrs.providers = json
        </properties>
    </pojo-deployment>
</openejb-jar>
  • resources.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <Service id="json" class-name="org.apache.cxf.jaxrs.provider.json.JSONProvider">
        SkipJaxbChecks = true
        DropRootElement = false
        SupportUnwrapped = true
        SingleJaxbContext = true
    </Service>
</resources>

Y finalmente asegúrese de que Jettison JAR 1.3.7 esté disponible en la carpeta TomEE / lib.

Comparando salidas

Item.java es el POJO que vamos a procesar:

package org.superbiz;

import jakarta.xml.bind.annotation.*;

@XmlRootElement(name = "book")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

    @XmlValue
    private String name;

    @XmlAttribute
    private int id;

    @XmlAttribute
    private String availableSince;

    @XmlAttribute
    private boolean available = false;

    public Item() {
    }

    public Item(String name, int id, String availableSince, boolean available) {
        this.name = name;
        this.id = id;
        this.availableSince = availableSince;
        this.available = available;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

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

    public String getAvailableSince() {
        return availableSince;
    }

    public void setAvailableSince(String availableSince) {
        this.availableSince = availableSince;
    }

    public boolean isAvailable() {
        return available;
    }

    public void setAvailable(boolean available) {
        this.available = available;
    }
}

Antigua salida JSON usando Jetty 1.3.7:

{"book":{"@id":"134","@availableSince":"2019-05-27 15:27:16.878","@available":"false","$":"TomEE Tutorial"}}

Actual salida JSON:

{"available":false,"availableSince":"2019-05-27 15:27:16.878","id":134,"name":"TomEE Tutorial"}

Acerca de la arquitectura de prueba

Los casos de prueba de este proyecto se construyen utilizando Arquillian y TomEE Remote. La configuración de arquillian puede ser encontrada en src/test/resources/arquillian.xml

Una parte importante de esta configuración es la inclusión de Jettison jar durante la ejecución de la prueba:

<property name="additionalLibs">mvn:org.codehaus.jettison:jettison:1.3.7</property>

Si se usa una versión > 1.3.7, la salida JSON empieza a cambiar a un formato predeterminado moderno: Los valores booleanos y numericos ya no están entre comillas dobles. == APIs Used