Jak wdrożyć aplikację JAX-RS?

Specyfikacja JAX-RS 1.1 mówi na stronie 6:

Jeśli nie ma podklasy aplikacji dodany servlet musi mieć nazwę:

javax.ws.rs.core.Application

Co to jest dodany servlet? Czy to może być dowolny servlet?

Jeśli występuje podklasa aplikacji i jest już zdefiniowany servlet który ma inicjalizację servleta parametr o nazwie:

javax.ws.rs.Application

Znowu, co to jest "servlet" tutaj?

Jeśli występuje podklasa aplikacji to nie jest obsługiwane przez istniejący servlet następnie servlet dodany przez ContainerInitializer musi być nazwane z pełną kwalifikowaną nazwą podklasy aplikacji.

Czy "servlet dodany przez ContainerInitializer" oznacza, że servlety są dodawane automatycznie? Jak wyglądałaby konfiguracja?

W tej chwili nie używam ani klasy aplikacji, ani sieci.xml i działa (z GlassFish 3.1). Czy ten mechanizm wdrażania wymaga pełnej klasy skanowanie ścieżek, które może być powolne przy dużych bibliotekach?

Jak wdrożyć na kontenerze Servlet?

Istnieje myląca liczba opcji konfiguracyjnych w Internecie. Zobacz ten przykład Z paramami kontekstowymi w sieci.xml (nie działa dla mnie!). Jaki jest preferowany sposób wdrożenia aplikacji JAX-RS?

Author: deamon, 2010-01-15

4 answers

W przeciwieństwie do Java EE 6, Java EE 6 nie jest implementowana w środowisku Java EE 6, ale jest implementowana w środowisku Java EE 6.]}

Najprostsze to:

<?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>

Wtedy wszystkie klasy @Path i @Provider Znalezione w Twojej aplikacji internetowej będą dostępne w "domyślnej" aplikacji JAX-RS z wzorcem URL servleta "/rest/*".

Jeśli masz jedną lub więcej klas, które rozszerzają javax.ws.rs.core.Application, możesz określić Tak:

<?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>

Możesz zrobić powyższe w przypadku, gdy chcesz zwracają tylko określone zestawy @Path/@Provider klasy na URL (więc można mieć drugi My Application2 z innym wzorcem URL powyżej).

Możesz także pominąć całą web.xml i po prostu dodać adnotację do swojej MyApplication klasy wih @ApplicationPath, która będzie służyć jako wzorzec URL. W każdym razie polecam zachować web.xml, ponieważ prawdopodobnie będziesz musiał tam dodać inne informacje o aplikacji internetowej.

Jeśli zastanawiasz się skąd pochodzi servlet-class, to jest automatycznie dodawane przez środowisko. Możesz się zorientować patrząc na Servlet 3.0 ServletContext.

 60
Author: Bryant Luk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-01 21:07:25

Z było 8.5, zmieniam sieć.xml do dodania:

<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>

Moja aplikacja wygląda tak:

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;
    }
}

Moja RestService wygląda jak

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

I dodaję do pom.XML zależność:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>
 1
Author: Matthieu Lambert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-29 11:54:48

Z Servlet3. 0, wykonaj to. To mi pasuje.

<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>
 0
Author: PrasadO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 12:44:44

Jak powiedziałem w komentarzu powyżej, wszystko zależy od frameworka, którego chcesz użyć.

Http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html dla Jersey http://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60.html dla RESTeasy

Z tego co wiem, JAX - RS nie zawiera specyfikacji wdrożenia.

 -3
Author: Robert Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 10:05:02