使用Jersey实现使用Restful Webservices时遇到问题。 在文档中写道,我应该下载这个: Jersey JAX-RS 2.0 RI bundle,解压缩并将jar添加到我的WEB-INF / lib中 夹。这些罐子是:
如果我这样做,我总是会遇到以下异常:
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.
我不知道如何正确使用球衣实施。
答案 0 :(得分:1)
为什么不按照Getting Started指南进行操作?它告诉你如何解决这个问题。
您会在WEB-INF/lib
中看到这些JAR需要在其他几个中:
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>
答案 1 :(得分: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
添加到我的电影实体课程中。
现在工作正常