Preloader image

This is a example on how to configure on TomEE 7.x or later the legacy JSON provider, Jettison, used by TomEE 1.7.x .

This scenario is useful when REST applications are migrated from TomEE 1.7.x into TomEE 7.x or later and you want to keep the lecacy JSON output from Jettison 1.3.7.

Run the tests

This example contains 2 test cases, one using Jettison and one with out it for comparison purposes.

mvn clean test

Enabling Jettison as Json Provider

You need to provide the following 2 files in your WEB-INF folder:

  • 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>

And finally make sure the Jettison JAR 1.3.7 is available in TomEE /lib folder.

Comparing outputs

Item.java is the POJO we are going to process:

package org.superbiz;

import javax.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;
    }
}

Legacy JSON output using Jettison 1.3.7:

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

Current JSON output:

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

About the Test architecture

The test cases from this project are built using Arquillian and TomEE Remote. The arquillian configuration can be found in src/test/resources/arquillian.xml

An important part for this configuration is the inclusion of Jettison jar during test execution:

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

If a version > 1.3.7 is used, the JSON output start to change into a modern default format: Boolean and numeric values are not longer surrounded with double quotes.