2016-07-15 67 views
0

我知道標題貌似很多人都問過這個問題,但我做了很多的研究,但沒有找到任何解決方案解決了我問題。我已經在這個問題上花了兩天時間,所以請幫助我!的Eclipse,maven的,澤西REST服務的servlet 3.0,Tomcat的7.0,HTTP 404錯誤

我想用Eclipse Kepler Service Release 2,Jersey內置的Eclipse內置maven,Servlet 3.0和Tomcat 7.0構建一個簡單的「hello world」類型的restful web服務。當我使用「運行方式」 - >「在服務器上運行」運行我的服務時,加載默認的「index.jsp」頁面時沒有問題,但在加載我的服務時不斷收到HTTP 404錯誤。

This image shows my project layout.

我實現應用程序類是這樣的:

package com.ys.java.ws; 

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

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

import com.ys.java.ws.resources.MyService; 

@ApplicationPath("/ys") 
public class MyApplication extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> s = new HashSet<Class<?>>(); 
     s.add(MyService.class); 
     return s; 
    } 

} 

我的資源類:

package com.ys.java.ws.resources; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

@Path("/test") 
public class MyService { 

    public MyService() { 

    } 

    @GET 
    @Path("/hello") 
    //@Produces(MediaType.TEXT_PLAIN) 
    @Produces("text/html") 
    public String getTestMsg() { 
     return "It works"; 
    } 
} 

我pom.xml文件是:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.ys.java.ws</groupId> 
    <artifactId>ysNoWebXML</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>ysNoWebXML Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <!-- Servlet 3.0 API --> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.0.1</version> 
     </dependency> 
     <!--JAX-rs web service API --> 
     <dependency> 
      <groupId>org.glassfish.jersey.core</groupId> 
      <artifactId>jersey-server</artifactId> 
      <version>2.23.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.core</groupId> 
      <artifactId>jersey-common</artifactId> 
      <version>2.23.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet</artifactId> 
      <version>2.23.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet-core</artifactId> 
      <version>2.23.1</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <finalName>TestService</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

我的web.xml是:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <display-name>Servlet 3.0 Web Application</display-name> 
    <servlet> 
     <servlet-name>com.ys.java.ws.MyApplication</servlet-name> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>com.ys.java.ws.MyApplication</servlet-name> 
     <url-pattern>/rest</url-pattern> 
    </servlet-mapping> 
</web-app> 

需要注意的是:在所有MyApplication類,我設置@ApplicationPath("/ys")並在web.xml中我設置<url-pattern>/rest</url-pattern>。我intensionally做到這一點根據jax-rs document以來,

If both the <servlet-mapping> and @ApplicationPath are specified, the <servlet-mapping> takes precedence.

我想測試是否是這種情況,但是不管我使用的路徑,我得到HTTP 404錯誤。

+0

我沒有看到你所使用做了測試訪問運行的應用程序是什麼網址。 –

+0

我沒有足夠的積分來添加2個以上的網址。所以...我測試了以下內容:http:// localhost:8080/TestService/rest/test/hello ---- get 404,http:// localhost:8080/TestService/ys/test/hello --- get 404,http:// localhost:8080/TestService ---起作用,加載默認的index.jsp – user2573741

+0

任何人都可以幫忙嗎? – user2573741

回答

0

這裏的web.xml文件的工作方式一個例子:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> 
    <servlet> 
     <servlet-name>comingsoon</servlet-name> 
     <servlet-class>mysite.server.ComingSoonServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>comingsoon</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

也許你需要同時擁有的servlet-name和servlet的類。注意servlet映射部分中的servlet-name必須與servlet部分中的servlet-name匹配。

通知你如何還需要在url-pattern的明星。你的看起來像「/ rest/*」。

+0

感謝您的回覆! - 添加*和確實有所作爲(這與doc中聲明的不同,它表示不需要標記)。服務器知道現在搜索我的應用程序類。 - 現在我得到HTTP 500錯誤'javax.servlet.ServletException:錯誤實例化servlet類com.ys.java.ws.MyApplication \t org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)',' java.lang.ClassNotFoundException:com.ys.java.ws.MyApplication'。任何想法? – user2573741

0

我終於得到它的工作!在這裏發佈我的解決方案,以防萬一任何人在將來遇到類似的問題。

我之前犯的一些錯誤現在已經得到糾正。

  1. <url-pattern>中加入/*很重要。我看到很多教程不使用*,但它是錯誤的。
  2. 你不需要的servlet 3.0 <servlet-class>標籤。相反,將您的應用程序類的標準名稱放在<servlet-name>標記中。所以jax-rs文件是正確的。
  3. 這顆子彈並不那麼重要,但我對它很好奇,現在理解它並分享它。所以「jersey-container-servlet-core」和「jersey-container-servlet」是類似的軟件包,但前者適用於Jersey 2.x,並不適用於Jersey 3.x。 This blog談論細節。出於這個原因,我的pom.xml文件中只需要「jersey-container-servlet」。

所以我最後的web.xml是:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <display-name>Servlet 3.0 Web Application</display-name> 
    <servlet> 
     <servlet-name>com.ys.java.ws.MyApplication</servlet-name> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>com.ys.java.ws.MyApplication</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 
相關問題