1

Jersey 実装を使用した Restful Webservices の使用に問題があります。ドキュメントには、これをダウンロードする必要があると書かれています: Jersey JAX-RS 2.0 RI bundle、解凍し、jars を WEB-INF/lib フォルダーに追加します。これらの jar は次のとおりです。

  • ジャージ-クライアント
  • ジャージ共通
  • ジャージーコンテナサーブレット
  • ジャージ-コンテナ-サーブレット-コア
  • ジャージサーバー

そうする場合、常に次の例外が発生します。

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

いくつかの調査の後、上記のダウンロード ソースから jar を追加する代わりに 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.

ジャージの実装を正しく使用する方法がわかりません。

4

2 に答える 2

1

問題を解決しました。

すべてのジャージー jar を削除し、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、私の Movie Entity クラスに追加しました。

今では正常に動作します

于 2013-06-29T11:24:59.397 に答える
1

入門ガイドに従ってみませんか? これについてどうすればよいかを正確に教えてくれます。

いくつかある中で、次の 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>
于 2013-06-28T22:44:27.320 に答える