Pergunta

A especificação JAX-RS 1.1 diz na página 6:

Se nenhuma subclasse de aplicação estiver presente, o servlet adicionado deve ser nomeado:

javax.ws.rs.core.Application

Qual é o servlet adicionado? Poderia ser um servlet arbitrário?

Se uma subclasse de aplicativo estiver presente e já existe um servlet definido que possui um parâmetro de inicialização de servlet chamado:

javax.ws.rs.Application

Novamente, o que é "um servlet" aqui?

Se uma subclasse de aplicativo estiver presente que não esteja sendo tratada por um servlet existente, o servlet adicionado pelo contêinerinitializador deverá ser nomeado com o nome totalmente qualificado da subclasse do aplicativo.

"O servlet adicionado pelo contêinerinitializer" significa que os servlets são adicionados automaticamente? Como seria uma configuração?

No momento, não uso uma classe de aplicativo nem um web.xml e funciona (com o Glassfish 3.1). Esse mecanismo de implantação exige uma varredura de caminho de classe completa, que pode ser lento com grandes bibliotecas?

Como implantar em um contêiner de servlet?

Há um número confuso de opções de configuração na web. Veja isso Exemplo com parâmetros de contexto no web.xml (Não funciona para mim!). Qual é a maneira preferida de implantar um aplicativo JAX-RS?

Foi útil?

Solução

Existem várias opções para implantar em um contêiner Java EE 6 (mais especificamente uma implementação do Servlet 3.0):

O mais simples é:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

Então tudo @Path e @Provider As aulas encontradas no seu aplicativo da Web estarão disponíveis no aplicativo Jax-RS "padrão" com um padrão de URL de servlet de "/rest/*".

Se você tem uma ou mais classes que se estende javax.ws.rs.core.Application, você pode especificar assim:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>com.example.jaxrs.MyApplication</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.example.jaxrs.MyApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

Você pode querer fazer o que você deseja devolver apenas conjuntos específicos de @Path/@Provider Aulas em um URL (para que você possa ter uma segunda aplicação2 com um padrão de URL diferente acima).

Você também pode pular o todo web.xml no total e apenas anote o seu MyApplication Classe Wih @ApplicationPath que servirá como padrão de URL. Eu recomendaria manter o web.xml De qualquer forma, porque você provavelmente terá que adicionar outras informações sobre o aplicativo da web lá de qualquer maneira.

Se você está se perguntando onde o servlet-class Vem de, ele é adicionado automaticamente pelo ambiente. Você pode ter uma ideia olhando para o servlet 3.0 ServletContext.

Outras dicas

Com 8.5, eu altero o web.xml para adicionar:

<servlet>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.tada.rest.RestApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Minha restrição é:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

public class RestApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> sets = new HashSet<Class<?>>();
        sets.add(RestService.class);
        return sets;
    }
}

Meu serviço de repouso se parece

@Path("/tada")
public class RestService {
    @GET
    public String getSomething() {
        return "tada";
    }
}

E eu adiciono o pom.xml a dependência:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>

Com o servlet3.0, siga isso. Isso funciona para mim.

<servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>your.restsrv.config.RESTConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <enabled>true</enabled>
    <async-supported>false</async-supported>
</servlet>
<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Como eu disse no comentário acima, tudo depende da estrutura que você deseja usar.

http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html para Jerseyhttp://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60.html Para Restasy

Até onde eu sei, o JAX-RS não contém uma especificação para implantação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top