| = Provedor JAX-RS JSON com Jettison |
| :index-group: REST |
| :jbake-type: page |
| :jbake-status: status=published |
| |
| Este é um exemplo de como configurar no TomEE 7.x ou posterior o provedor JSON herdado, Jettison, usado pelo TomEE 1.7.x. |
| |
| Este cenário é util quando aplicações REST são migradas de TomEE 1.7.x para TomEE 7.x ou posterior e você quer manter a saída JSON herdada do Jettison 1.3.7. |
| |
| |
| === Executando os testes |
| Este exemplo contém 2 casos de teste, um usando o Jettison e outro sem ele para fins de comparação. |
| |
| [source,java] |
| ---- |
| mvn clean test |
| ---- |
| |
| |
| === Habilitando o Jettison como provedor Json |
| |
| Você precisa fornecer os 2 arquivos a seguir na pasta `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> |
| |
| ---- |
| |
| E, finalmente, verifique se o Jettison JAR 1.3.7 está disponível na pasta TomEE /lib. |
| |
| === Comparando saídas |
| |
| `Item.java` é o POJO que vamos processar: |
| |
| [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; |
| } |
| } |
| ---- |
| |
| |
| Saída JSON herdada usando o Jettison 1.3.7: |
| [source,java] |
| ---- |
| {"book":{"@id":"134","@availableSince":"2019-05-27 15:27:16.878","@available":"false","$":"TomEE Tutorial"}} |
| ---- |
| |
| Saída JSON atual: |
| |
| [source,java] |
| ---- |
| {"available":false,"availableSince":"2019-05-27 15:27:16.878","id":134,"name":"TomEE Tutorial"} |
| ---- |
| |
| === Sobre a arquitetura de teste |
| |
| Os casos de teste deste projeto são construídos usando Arquillian e TomEE |
| Controlo remoto. A configuração arquilliana pode ser encontrada em `src/test/resources/arquillian.xml` |
| |
| Uma parte importante dessa configuração é a inclusão do jar do Jettison durante a execução do teste: |
| |
| [source,xml] |
| ---- |
| <property name="additionalLibs">mvn:org.codehaus.jettison:jettison:1.3.7</property> |
| ---- |
| |
| Se uma versão> 1.3.7 for usada, a saída JSON começará a mudar para um formato padrão moderno: valores booleanos e numéricos não são mais cercados por aspas duplas. |