2012-09-14 3 views
19

Jeśli zamienię wzór adresowy Jersey na/* w wersji 2.0, spowoduje to 404 dla wszystkich zasobów statycznych (np. /index.html). Mój web.xml ma:Mapowanie serwletu Jersey/* powoduje błąd 404 dla zasobów statycznych

<servlet> 
    <servlet-name>JerseyApp</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
    <param-name>javax.ws.rs.Application</param-name> 
    <param-value>org.frog.jump.JerseyApp</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>JerseyApp</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Jak mogę wyświetlać treść statyczną przy użyciu tego samego wzorca URL?

Odpowiedz

24

Z Jersey 1.x powinieneś być w stanie obsłużyć zawartość statyczną z tej samej ścieżki, jeśli przełączysz się z serwletu Jersey na filtr. Upuść XML serwletu już określony i przełączyć go na adres:

<filter> 
    <filter-name>Jersey Filter</filter-name> 
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class> 
    <init-param> 
    <param-name>javax.ws.rs.Application</param-name> 
    <param-value>org.frog.jump.JerseyApp</param-value> 
    </init-param> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name> 
    <param-value>/.*html</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Jersey Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

EDIT: w Jersey 2.x powinieneś być w stanie zrobić to samo, ale nazwy właściwości zostały zmienione. Spróbuj czegoś takiego:

<filter> 
    <filter-name>Jersey Filter</filter-name> 
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class> 
    <init-param> 
    <param-name>jersey.config.server.provider.packages</param-name> 
    <param-value>org.example</param-value> 
    </init-param> 
    <init-param> 
    <param-name>jersey.config.servlet.filter.staticContentRegex</param-name> 
    <param-value>/.*html</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Jersey Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

A twój POM powinien zawierać:

<dependency> 
    <groupId>org.glassfish.jersey.core</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>2.0-m07-1</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet-core</artifactId> 
    <version>2.0-m07-1</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 

Będziesz musiał dostosować wyrażenia regularnego w init-param jeśli chcesz służyć CSS, JSP itp

Inną dobrą opcją jest użycie wersjonowanej ścieżki do usług ("/ v1/*"), a następnie statyczna zawartość będzie działała bez filtra.

+2

Jeśli się nie mylę nie można już zrobić w wersji 2.x. com.sun.jersey.spi.container.servlet.ServletContainer nie jest częścią koszulki 2.X myślę. – FUD

+0

Zaktualizowano odpowiedź, dodając opcję 2.x. Pakiet się zmienił. – condit

+1

Nie bardzo związane, ale zastanawiałem się, czy byłoby możliwe ustawienie tych parametrów "programowo"/Adnotacja/Właściwości. Wygląda na to, że z JEE6 nie jest to możliwe. Z JEE7 może to być, przez Application.getProperites(). Put (klucz, wartość)? – icyerasor

9

powinien dodać filtr forwardOn404 Aby rozwiązać ten problem

<filter> 
     <filter-name>org.glassfish.jersey.examples.bookstore.webapp.MyApplication</filter-name> 
     <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>org.glassfish.jersey.examples.bookstore.webapp.MyApplication</param-value> 
     </init-param> 
     <!-- pass to next filter if Jersey/App returns 404 --> 
     <init-param> 
      <param-name>jersey.config.servlet.filter.forwardOn404</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 

jak to zrobiono w tym przykładzie https://github.com/jersey/jersey/blob/2.17/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml

+3

Dla firmy Jersey 1.x jej "com.sun.jersey.config.feature.FilterForwardOn404' –