2013-06-28 3 views
1

У меня проблемы с использованием Restful Webservices с использованием реализации Джерси. В документации написано, что я должен загрузить это: Jersey JAX-RS 2.0 RI bundle, разархивировать его и добавить банки в папку WEB-INF/lib . Эти банки являются:Restful Ошибка сервера JAX-RS

  • Джерси-клиент
  • Джерси-общего
  • Джерси-контейнер сервлет
  • Джерси-контейнер-сервлет-жильный
  • Джерси-сервер

Если я делаю это, я всегда получаю следующее исключение:

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

После некоторого исследования выяснилось, что я должен добавить jersey-servlet-1.12.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. 

I Не знаю, как правильно использовать реализацию трикотажа.

ответ

1

Я решил проблему.

Я удалил все jersey jars, и я удалил часть webservices из web.xml.

Я изменил мой тестовый класс к этому:

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 к моему классу Movie Entity.

Теперь он отлично работает

1

Почему бы вам не просто следовать руководству Getting Started? Он рассказывает вам, как это сделать.

Вы бы увидели, что вам нужно, среди нескольких других, эти банки в 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