2012-05-08 46 views
11

Đây là lần đầu tiên tôi sử dụng Eclipse và khiến tôi phát cuồng lên rất nhiều.Dịch vụ web còn lại trả lại 404

Tôi đã cài đặt Tomcat 6.0, tải về các thư viện Jersey, và tôi đi theo các hướng dẫn từ: http://www.vogella.com/articles/REST/article.html#first_client

tôi đã tạo Project Name như RestExample, và trong phạm vi mà tôi có một gói de.jay.jersey.first và trong vòng rằng tôi có một HelloWorldResource lớp, và đây là những gì nó trông giống như:

package de.jay.jersey.first; 

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

@Path("/hello") 
public class HelloWorldResource { 
// This method is called if TEXT_PLAIN is request 
@GET 
@Produces(MediaType.TEXT_PLAIN) 
public String sayPlainTextHello() { 
    return "Hello Jersey"; 
} 

// This method is called if XML is request 
@GET 
@Produces(MediaType.TEXT_XML) 
public String sayXMLHello() { 
    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>"; 
} 

// This method is called if HTML is request 
@GET 
@Produces(MediaType.TEXT_HTML) 
public String sayHtmlHello() { 
    return "<html> " + "<title>" + "Hello Jersey" + "</title>" 
      + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> "; 
} 
} 

và web.xml của tôi trông giống như

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>RestExample</display-name> 
    <servlet> 
<servlet-name>Jersey REST Service</servlet-name> 
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>de.jay.jersey.first</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 
</web-app> 

và tôi đang cố gắng sử dụng curl như:

curl http://localhost:8081/RestExample/rest/hello

Apache Tomcat/6.0.35 - Lỗi báo cáo

HTTP Status 404 -/RestExample/nghỉ ngơi/Hello

loại Tình trạng tái cổng

nhắn/RestExample/nghỉ ngơi/hello

de scription tài nguyên yêu cầu (/ RestExample/nghỉ ngơi/hello) là không có sẵn.

Apache Tomcat/6.0.35

Câu hỏi đặt ra là tôi nên thay đổi điều gì trong tệp web.xml để tôi có thể truy cập tài nguyên đó?

Tôi đã thử RestExample/de.jay.jersey.first/rest/hello và nó vẫn không hoạt động. TOmcat đang chạy mà không có lỗi.

+0

Bạn đã triển khai ứng dụng này với Tomcat như thế nào? Cụ thể, tệp web.xml của bạn nằm ở đâu và tệp lớp của bạn nằm ở đâu? –

+0

Tôi đã thử Tomcat 7.0 và nó hoạt động tốt – DaTroop

+0

Tôi chỉ thay đổi những thứ tối thiểu như phiên bản Servlet từ 2.5 đến 3.0 trong web.xml – DaTroop

Trả lời

1

Tôi đã thử nó với Tomcat 7.0 và nó hoạt động tốt:

package de.jay.jersey.first; 

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

@Path("/hello") 
public class HelloWorldResource { 
// This method is called if TEXT_PLAIN is request 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String sayPlainTextHello() { 
     return "Hello Jersey"; 
    } 

// This method is called if XML is request 
    @GET 
    @Produces(MediaType.TEXT_XML) 
    public String sayXMLHello() { 
     return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>"; 
    } 

// This method is called if HTML is request 
    @GET 
    @Produces(MediaType.TEXT_HTML) 
    public String sayHtmlHello() { 
     return "<html> " + "<title>" + "Hello Jersey" + "</title>" 
       + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> "; 
    } 
} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" 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"> 
    <display-name>RestExample</display-name> 
    <servlet> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>de.jay.jersey.first</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

duyệt đến http://localhost:8084/RestExample/rest/hello và nó hoạt động ok

+0

Cấu hình này tốt nếu bạn ở trên Jersey 1.x. Jersey 2.x có tên gói và tên thuộc tính container khác nhau. Vì vậy, cấu hình tương tự sẽ không hoạt động nếu bạn đang sử dụng các lọ 2.x. Chỉ cần nghĩ rằng tôi sẽ đề cập đến nó, do đó, nó sẽ phụ tùng rắc rối không cần thiết cho một người có lọ 2.x trong classpath của nó. – adityalad

-2

như aticle nói:

// Get the Todos 
    System.out.println(service.path("rest").path("todos").accept(
      MediaType.TEXT_XML).get(String.class)); 
    // Get XML for application 
    System.out.println(service.path("rest").path("todos").accept(
      MediaType.APPLICATION_JSON).get(String.class)); 
    // Get JSON for application 
    System.out.println(service.path("rest").path("todos").accept(
      MediaType.APPLICATION_XML).get(String.class)); 

bạn cố gắng xác định đường dẫn phương thức mà bạn muốn gọi

12

Tôi mất rất nhiều thời gian để tìm ra lý do tại sao nó không hoạt động để tôi tìm kiếm trên web để tìm giải pháp. Sai lầm tôi đã làm là tên gói đã không được cập nhật để api jersey mới. Đây là những gì tên gói cập nhật sẽ giống như thế (web.xml):

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" 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"> 
    <display-name>RestExample</display-name> 
    <servlet> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>de.jay.jersey.first</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

ý rằng <servlet-class><param-name> là khác nhau (cập nhật) từ vogella tutorial. Nó có thể không phải là câu trả lời cho câu hỏi cụ thể này nhưng có thể giúp ai đó. Tôi tìm thấy nó từ here.

+0

cảm ơn @gndps bạn đã lưu ngày của tôi. Câu trả lời của bạn xứng đáng để được ở trên thực tế. Tôi đã thay đổi dự án và di chuyển phần web.xml nhưng tôi quên thay đổi tên gói của mình. Câu trả lời của bạn đã giúp tôi. Cảm ơn một lần nữa – samir

+0

@samir - những gì gndps có nghĩa là không phải là tên của gói của bạn, nhưng tên init init nơi bạn cung cấp tên gói của bạn trong web.xml. vẫn khắc phục bạn đã làm là hợp lệ cho vấn đề của bạn, nhưng hơi khác với vấn đề được giải thích ở đây. Tên init-param để đề cập đến các gói khác với các phiên bản jersey khác nhau. –

2

Vui lòng thêm tất cả các Chum được đưa ra trong dự án của bạn

dự án (Right Click)> Properties> Java Build Path> Thư viện> Thêm lọ/Thêm lọ ngoài

  1. asm-3.1.jar
  2. jersey-bó-1.14.jar
  3. jersey-client.jar
  4. jersey-core.1.17.1.jar
  5. jersey-server-1.17.jar
  6. jersey-servlet-1.17.jar
0

tôi đã tìm kiếm một giải pháp cho vấn đề tương tự trong nhiều giờ quá.

này giải quyết vấn đề của tôi:

nếu bạn sử dụng một Maven-dự án (ví dụ với nguyên mẫu maven-nguyên mẫu-webapp) và HelloWorldResource lớp được thực hiện trong thư mục src/main/nguồn lớp này doesn 't được biên dịch (ví dụ sau đó chạy 'mvn gói sạch' hoặc 'chạy trên máy chủ' trong eclipse)

Thực hiện HelloWorldResource trong thư mục src/main/java thay vào đó và không 404 occures .. (nếu bạn tạo Maven-Project với maven-archetype-webapp thư mục cần được tạo thủ công)

1

Kiểm tra xem đường dẫn của bạn có thanh này '/' dụ: @Path ('/ path') trong một số trường hợp vấn đề này chỉ là thanh thiếu!

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