| = JAX-RS Proveedor JSON con Jettison |
| :index-group: REST |
| :jbake-type: page |
| :jbake-status: status=published |
| |
| 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. |
| |
| [source,java] |
| ---- |
| mvn clean test |
| ---- |
| |
| |
| === Habilitación de Jettison como proveedor JSON |
| |
| Debe proporcionar los siguientes 2 archivos en su carpeta WEB-INF: |
| |
| * openejb-jar.xml |
| [source,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 |
| |
| [source,java] |
| ---- |
| |
| <?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: |
| |
| [source,java] |
| ---- |
| 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; |
| } |
| } |
| ---- |
| |
| |
| Antigua salida JSON usando Jetty 1.3.7: |
| [source,java] |
| ---- |
| {"book":{"@id":"134","@availableSince":"2019-05-27 15:27:16.878","@available":"false","$":"TomEE Tutorial"}} |
| ---- |
| |
| Actual salida JSON: |
| |
| [source,java] |
| ---- |
| {"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: |
| |
| [source,xml] |
| ---- |
| <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. |