2013-06-28 75 views
1

我在使用Jersey實現使用Restful Webservices時遇到問題。 在文檔中寫道,我應該下載這個: Jersey JAX-RS 2.0 RI bundle,解壓縮並將jar添加到我的WEB-INF/lib文件夾中。這些罐子:Restful JAX-RS服務器錯誤

  • 球衣的客戶端
  • 球衣常見
  • 球衣,容器的servlet
  • 球衣,容器servlet的核心
  • 球衣服務器

如果我這樣做,我總是得到以下異常:

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer 

經過一番研究,我發現我應該添加jersey-servlet-1.12.jar而不是 添加上面提供的下載源中的jar。所以我做到了。我加入 這對我的web.xml

<servlet> 
    <servlet-name>JAX-RS Servlet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>JAX-RS Servlet</servlet-name> 
    <url-pattern>/jaxrs/*</url-pattern> 
</servlet-mapping> 

而且我實現了一個小測試類:

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.TypedQuery; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

import de.hof.university.spj.model.Movie; 

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

    @GET 
    @Produces("application/json; charset=UTF-8") 
    public List<Movie> getMovieList() { 
     EntityManagerFactory factory = Persistence.createEntityManagerFactory("SPJUnit"); 
     EntityManager em = factory.createEntityManager(); 

     TypedQuery<Movie> query = em.createQuery("Select m FROM Movie m WHERE m.movieID = 4204", Movie.class); 

     return query.getResultList(); 
    } 
} 

當我現在請http://localhost:8080/MyApp/jaxrs/test我得到這個錯誤:

HTTP Status 500 - Internal Server Error. The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request. 

我不知道如何正確使用球衣執行。

回答

1

我解決了這個問題。

我刪除了所有的澤西罐子,我從web.xml中刪除了webservices部分。

我改變了我的測試類是:

import java.io.Serializable; 
import java.util.List; 

import javax.enterprise.context.RequestScoped; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.TypedQuery; 
import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.core.MediaType; 
import de.hof.university.spj.model.Movie; 

@RequestScoped 
@ApplicationPath("/webservices") 
@Path("/movies") 
public class Test extends Application implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Movie> getMovieList() { 
     EntityManagerFactory factory = Persistence.createEntityManagerFactory("SPJUnit"); 
     EntityManager em = factory.createEntityManager(); 

     TypedQuery<Movie> query = em.createQuery("Select m FROM Movie m WHERE m.movieID = 4204", Movie.class); 

     return query.getResultList(); 
    } 
} 

並且我增加了@XmlRootElement到我的電影實體類。

現在它正常工作

1

爲什麼不按照Getting Started指南?它告訴你如何去做這件事。

你會看到,你需要,除少數人,這些JAR在WEB-INF/lib

javax.annotation-api-1.2.jar 
javax.inject-2.1.88.jar 
javax.ws.rs-api-2.0.jar 
jersey-client-2.0.jar 
jersey-common-2.0.jar 
jersey-container-servlet-core-2.0.jar 
jersey-server-2.0.jar 

您也想看到web.xml需要類似於此:

<servlet> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.example</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <url-pattern>/webapi/*</url-pattern> 
</servlet-mapping> 
+4

因爲我已經做到了! javax.annotation,javax.inject,javax.ws.rs已經存在於我的項目中包含的javaee-api-6.0.jar中。如果我使用入門指南中的web.xml示例,則該項目甚至因此而失敗:java.lang.ClassNotFoundException:javax.ws.rs.ProcessingException。有關更多詳細信息,請參閱server.log。 – Mulgard