quarta-feira, 7 de setembro de 2016

Usando Jersey 2.x no JBoss 7

Olá povo, depois de anos sem postar nada por aqui, resolvi voltar a postar aqui para ajudar alguem que esteja com o mesmo problema que tive: Fazer o Jersey 2.x funcionar no JBoss 7.x. Foi complicado, mas enfim conseguir fazer funcionar.

O que é o Jersey?

Bom se não sabem o que é o Jersey, vou resumir: Uma implementação da JSR-311, pronto ;)

Mas é isso mesmo, ele implementa a especificação referente a serviços RESTfull, que está bem comum o uso ultimamente.

Mãos a obra

Primeiramente, meu projeto é um projeto maven. Estou usando o eclipse Mars.2 como IDE de desenvolvimento, com o plugin para ajudar no desenvolvimento de projetos web o JBoss Tools 4.3.1.Final mantido pela RedHat.

Caso seu projeto seja executado no jboss será necessário configurar, no projeto, para que o JBoss não faça referencia às suas libs que implementam o jax-ws-rs, pois nele estão as versões 1.x, logo temos que exclui-las do projeto.

Arquivo jboss-deployment-structure.xml

Para isso, no diretório /WEB-INF crie o arquivo jboss-deployment-structure.xml com o conteúdo abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <!-- Exclude RestEasy conflict -->
            <module name="javaee.api" />
            <module name="javax.ws.rs.api"/>
            <module name="org.jboss.resteasy.resteasy-jaxrs" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Dependencias no pom.xml

Como estou usando a versão 2.23.2 do Jersey o Maven deve ficar com as seguintes dependências:
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.security</groupId>
<artifactId>oauth2-client</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-servlet</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
</dependency>

Parametros do web.xml

No web.xml devem ser setados os seguintes parametros de contexto:
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.providers</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.resources</param-name>
<param-value>false</param-value>
</context-param>

A implementação do javax.ws.rs.core.Application

A classe que implementa javax.ws.rs.core.Application deve seguir o seguinte formato padrão anotado com @ApplicationPath, no meu caso meu Path para acesso aos meus serviços é "/api", como segue abaixo:
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/api")
public class RestApplication extends Application {
}

Pronto, creio que sua aplicação está pronta para usar o Jesey 2.x junto com o Jboss AS 7.

Espero ter ajudado, pelo menos a mim teria sido bem util essas informações.