2012-09-14 24 views
19

Nếu tôi ánh xạ mẫu url của Jersey đến/* trong bản phát hành 2.0, nó gây 404 cho tất cả tài nguyên tĩnh (ví dụ: /index.html). My web.xml có:Jersey/* bản đồ servlet gây lỗi 404 cho tài nguyên tĩnh

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

Làm cách nào để phân phối nội dung tĩnh có cùng mẫu url?

Trả lời

24

Với Jersey 1.x bạn sẽ có thể phân phát nội dung tĩnh từ cùng một đường dẫn nếu bạn chuyển từ servlet Jersey sang bộ lọc. Thả XML servlet bạn đã chỉ định và chuyển đổi nó để:

<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: Trong Jersey 2.x bạn sẽ có thể làm điều tương tự nhưng tên của các thuộc tính đã được thay đổi. Hãy thử một cái gì đó như:

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

Và POM của bạn nên bao gồm:

<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ạn sẽ phải tùy chỉnh các biểu thức chính quy trong init-param nếu bạn muốn để phục vụ css, jsp vv

Một tùy chọn tốt khác là sử dụng đường dẫn được phiên bản cho các dịch vụ của bạn ("/ v1/*") và sau đó nội dung tĩnh sẽ hoạt động mà không có bộ lọc.

+2

Nếu tôi không sai, bạn không còn có thể làm được điều này trong các phiên bản 2.x. com.sun.jersey.spi.container.servlet.ServletContainer không phải là một phần của jersey 2.X tôi nghĩ vậy. – FUD

+0

Cập nhật câu trả lời để bao gồm tùy chọn 2.x. Gói đã thay đổi. – condit

+1

Không thực sự liên quan có thể, nhưng tôi tự hỏi nếu nó sẽ có thể thiết lập các params "programmatically"/chú thích/Properties. Có vẻ như với JEE6 điều này là không thể. Với JEE7 nó có thể là, thông qua Application.getProperites(). Put (key, value)? – icyerasor

9

Bạn phải thêm bộ lọc forwardOn404 để giải quyết vấn đề này

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

Như thực hiện trong ví dụ này https://github.com/jersey/jersey/blob/2.17/examples/bookstore-webapp/src/main/webapp/WEB-INF/web.xml

+3

Đối với Jersey 1.x, 'com.sun.jersey.config.feature.FilterForwardOn404' của nó –

Các vấn đề liên quan