Apache Wink está se tornando rapidamente uma das implementações da especificação JAX-RS. JSON.org e Jettison, os provedores padrão para sincronização JSON, têm alguns problemas. Por exemplo, sua representação de array e tipos de retorno limitados dificulta a codificação de serviços JAX-RS e de seus aplicativos Ajax clientes.
Este artigo detalha um método para configurar um aplicativo da Web existente ativado para Apache Wink ativado para usar o provedor Jackson JSON. Saiba sobre as vantagens deste provedor usando código de amostra para um serviço da Web JAX-RS simples ativado para Jackson.
Provedores JSON fornecidos com Apache Wink
Apache Wink fornece dois provedores JSON como parte da distribuição padrão: implementações JSON.org e Jettison. Ambos os provedores têm problemas que dificultam a integração de serviços Wink com aplicativos Ajax. Nenhum dos provedores pode serializar diretamente uma Lista Java para JSON como um tipo de retorno, devido ao requisito JAXB de um elemento XML abrangente. Ambos os provedores também têm problemas adicionais, tais como:
- JSON.org
- A serialização de array com o provedor JSON.org é previsível, mas o comportamento é indesejável ao interagir com Ajax. Quando encontra arrays de tamanhos diferentes, JSON.org as representa de forma diferente:
- 2+ : Serialização de arrays "correta". Por exemplo:
object : { array : ["element1", "element2"] } - 1 : Reduz a array. Por exemplo:
object : { array : "element1" } - 0 : Remove a array completamente. Por exemplo:
object : { }
Está claro que as concessões do código para as diferentes estruturas no Javascript levam a complexidade adicional indesejada.
- 2+ : Serialização de arrays "correta". Por exemplo:
- Jettison
- Jettison usa a convenção Badgerfish para geração de JSON, produzindo estruturas que podem ser de difícil navegação após serem convertidas em objetos Javascript.
Em seu núcleo, Jackson é um processador JSON usado para geração e análise de declarações JSON de objetos Java. Jackson também pode ser configurado como um provedor de serialização JSON para implementações JAX-RS.
Como provedor de serialização JAX-RS, Jackson tem várias vantagens em relação a JSON.org e Jettison, como descrito abaixo.
Tabela 1. Vantagens do Jackson
| Vantagem | Descrição |
|---|---|
| Capacidade de serializar Listas de movo nativo | Jackson pode retornar diretamente uma Lista de objetos de cadeia de caractere de um serviço sem um elemento XML de wrapper. |
| Manipulação de arrays | Jackson tem recursos de serialização de arrays excelentes e previsíveis. |
| Agilidade | Comprovadamente mais rápido que outros provedores. |
| Licenciamento | A Licença Apache 2.0 é bem entendida. Componentes usando essa licença são usados em produtos comerciais e de software livre. |
Configurando Apache Wink para Jackson
As instruções para o exemplo neste artigo partem do pressuposto de que:
- Você tem um projeto dinâmico da Web existente configurado para usar Apache Wink como provedor JAX-RS.
- O servlet do Wink,
org.apache.wink.server.internal.servlet.RestServlet, está configurado no arquivo web.xml para usar um aplicativo JAX-RS, como mostra a Listagem 1.
Listagem 1. Fragmento de web.xml para servlet Wink
<servlet>
<servlet-name>WinkServlet</servlet-name>
<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.ibm.developerworks.winkJackson.WinkApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WinkServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
|
Faça o download e instale as bibliotecas do Jackson
No Web site do Jackson, faça o download da versão mais recente do provedor Jackson (consulte Recursos para obter um link). Nesse momento, a equipe Jackson não fornece um recurso único de download para todas as bibliotecas exigidas para usar Jackson com Apache Wink. São necessárias versões ASL ou LGPL dos arquivos JAR, conforme a seguir.
- core-(asl/lgpl): as funções essenciais do Jackson
- mapper-(asl/lgpl): serialização POJO <-> JSON
- jax-rs: a interface entre Wink e Jackson
- jax-xc: compatibilidade reversa com anotações JAXB
Os arquivos JAR devem estar presentes no caminho de classe do seu projeto da Web. A maneira mais simples de fazer isso é colocá-los no seu diretório WEB-INF/lib. (É provável que seus arquivos JAR do Apache Wink já estejam nesse diretório.)
Configure Apache Wink para usar o provedor Jackson para serialização JSON
Neste momento, o provedor JSON Jackson está sendo carregado como parte do seu aplicativo da Web, mas Apache Wink não recebeu a ordem de usá-lo para serialização JSON.
Ajuste o aplicativo configurado do servlet do Wink para carregar o provedor, como mostra a Listagem 2.
Listagem 2. WinkApplication.java de amostra
package com.ibm.developerworks.winkJackson;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
// Jackson imports
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.AnnotationIntrospector;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
public class WinkApplication extends Application {
/**
* Get the list of service classes provided by this JAX-RS application
*/
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> serviceClasses = new HashSet<Class<?>>();
serviceClasses.add(HelloWorlds.class);
return serviceClasses;
}
@Override
public Set<Object> getSingletons() {
Set<Object> s = new HashSet<Object>();
// Register the Jackson provider for JSON
// Make (de)serializer use a subset of JAXB and (afterwards) Jackson annotations
// See http://wiki.fasterxml.com/JacksonJAXBAnnotations for more information
ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
mapper.getSerializationConfig().setAnnotationIntrospector(pair);
// Set up the provider
JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
jaxbProvider.setMapper(mapper);
s.add(jaxbProvider);
return s;
}
} |
Jackson oferece a oportunidade de retornar Listas Java facilmente a partir de suas funções, sem a necessidade de um elemento XML JAXB wrapper. A Listagem 3 mostra um exemplo.
Listagem 3. HelloWorlds.java
package com.ibm.developerworks.winkJackson;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("helloworlds")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorlds {
@GET
public List<String> helloWorlds() {
return Arrays.asList(new String [] {"Hello Earth!", "Hello Mars!" });
}
} |
Apache Wink é cada vez mais usado como uma implementação da especificação JAX-RS. JSON.org e Jettison, os provedores padrão para sincronização JSON, têm alguns problemas. Neste artigo, você aprendeu um método para configurar um aplicativo da Web existente ativado para Apache Wink para usar o provedor Jackson JSON. Um exemplo destacou a vantagem desse provedor ao usar código de amostra para um serviço da Web JAX-RS ativado para Jackson.
| Descrição | Nome | Tamanho | Método de download |
|---|---|---|---|
| Sample HelloWorlds Eclipse project archive | HelloWorlds.zip | 8KB | HTTP |
Informações sobre métodos de download
Aprender
- "RESTful Web services with Apache Wink, Part 1: Build an Apache Wink
REST service" (developerWorks, fevereiro de 2010) apresenta o provedor JAX-RS do Apache Wink.
-
"RESTful Web services: The basics" (developerWorks, novembro de 2008) apresenta os princípios básicos do Representational State Transfer (REST).
- RESTful Java with JAX-RS
explora como projetar e desenvolver serviços da Web distribuídos em código Java™ usando princípios de arquitetura RESTful e a especificação JAX-RS em Java EE 6.
Obter produtos e tecnologias
- Faça o download do Apache Wink e obtenha o código de origem e binários da versão mais recente da estrutura, junto com outros projetos de exemplo.
-
Faça download do Processador JSON Jackson usado neste artigo.
- Faça o download das versões de avaliação de produto IBM ou explore as versões de teste on-line no IBM SOA Sandbox e entre em contato com as ferramentas de desenvolvimento de aplicativos e produtos de middleware do DB2®, Lotus®,
Rational®, Tivoli® e WebSphere®.
Discutir
- Blogs do developerWorksConfira os blogs do developerWorks e participe da comunidade do developerWorks.

Nick Maynard trabalha para a equipe IBM Software Solutions Transformation em Hursley, Reino Unido. Ele especializou-se ou programação da Web, Linux, serviços da Web e tecnologias de integração de negócios. É possível entrar em contato com Nick pelo nick.maynard@uk.ibm.com.