2016-07-15 24 views
0

Ich weiß der Titel sieht aus wie viele Leute haben diese Frage schon einmal gestellt, aber ich habe eine Menge Forschung und konnte keine Lösung finden, löst meine Problem. Ich habe zwei Tage mit diesem Thema verbracht, also bitte hilf mir!Eclipse, Maven, Jersey REST Service, Servlet 3.0, Tomcat 7.0, HTTP 404 Fehler

Ich versuche, eine einfache "Hallo Welt" Art von erholsamen Web-Service mit Eclipse Kepler Service Release 2, Jersey, Eclipse integrierten Maven, Servlet 3.0 und Tomcat 7.0 zu bauen. Wenn ich meinen Dienst mit "Ausführen als" -> "Auf Server ausführen" ausführe, gibt es kein Problem beim Laden der Standardseite "index.jsp", aber beim Laden meines Dienstes bekomme ich immer wieder den HTTP 404-Fehler.

This image shows my project layout.

Meine Klasse, die Anwendung implementiert ist wie folgt aus:

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

} 

Meine Ressourcenklasse ist:

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

Meine pom.xml Datei ist:

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

Mein web.xml ist:

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

Beachten Sie, dass: in MyApplication Klasse, habe ich @ApplicationPath("/ys") und in web.xml stelle ich <url-pattern>/rest</url-pattern>. Ich tue dies intensional da nach jax-rs document,

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

Ich möchte testen, ob dies der Fall ist, aber egal, welchen Weg ich, erhalte ich HTTP 404 Fehler. Hier

+0

Ich sehe nicht, welche URL Sie verwenden den Test Zugriff auf Ihre laufenden Anwendung zu tun. –

+0

Ich habe nicht genug Punkte, um mehr als 2 URLs hinzuzufügen. Also ... habe ich Folgendes getestet: http: // localhost: 8080/TestService/rest/test/Hallo ---- get 404, http: // localhost: 8080/TestService/ys/test/hallo --- get 404, http: // localhost: 8080/TestService --- funktioniert, lädt default index.jsp – user2573741

+0

Kann jemand helfen? – user2573741

Antwort

0

ist ein Beispiel für die Art und Weise der web.xml funktioniert:

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

Vielleicht müssen Sie sowohl Servlet-Name und Servlet-Klasse haben. Beachten Sie, dass der Servlet-Name im Servlet-Mapping-Abschnitt dem Servlet-Namen im Servlet-Abschnitt entsprechen muss.

Beachten Sie, wie Sie auch einen Stern im URL-Muster benötigen. Ihr würde aussehen wie "/ Ruhe/*".

+0

Danke für Ihre Antwort! - Das Hinzufügen von * und macht einen Unterschied (dies unterscheidet sich von dem, was in dem Dokument behauptet wird, das besagt, dass kein -Tag benötigt wird). Der Server kann jetzt nach meiner Anwendungsklasse suchen. - Jetzt bekomme ich HTTP 500 Fehler 'javax.servlet.ServletException: Fehler instanziiert Servlet-Klasse com.ys.java.ws.MyApplication \t org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:505)', ' java.lang.ClassNotFoundException: com.ys.java.ws.MyApplication'. Irgendeine Idee? – user2573741

0

Endlich habe ich es geschafft! Poste meine Lösung hier für den Fall, dass jemand ähnliche Probleme in der Zukunft hat.

Es gibt ein paar Fehler, die ich vorher gemacht und jetzt korrigiert habe.

  1. Hinzufügen /* in der <url-pattern> ist wichtig. Ich habe viele Tutorials nicht benutzt *, aber es ist falsch.
  2. Sie benötigen das <servlet-class>-Tag in Servlet 3.0 nicht. Fügen Sie stattdessen den vollständig qualifizierten Namen Ihrer Anwendungsklasse in das Tag <servlet-name> ein. Also ist das jax-rs-Dokument korrekt.
  3. Diese Kugel ist nicht so kritisch, aber ich war neugierig und verstehe es jetzt und teile es einfach. So sind "Jersey-Container-Servlet-Kern" und "Jersey-Container-Servlet" ähnliche Pakete, aber der ehemalige passt sich Jersey 2.x an und wird nicht für Jersey 3.x funktionieren. This blog spricht über Details.Aus diesem Grund wird nur "Jersey-Container-Servlet" in meiner pom.xml-Datei benötigt.

Also meine letzte web.xml ist:

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