1

わかりました、2 つの安らかな Web サービス クラス Login.class と Subscribe.class を含むパッケージがあります。それらをアプリ エンジンにデプロイしてテストすると、動作します。ここで、新しいサービス クラス名 User s.class をパッケージに追加します。サービスを呼び出すと、サービスが動作しなくなり、内部サーバー エラーが発生します。

com.sun.jersey.spi.inject.Errors processErrorMessages: The following errors and warnings have been detected with resource and/or provider classes:

SEVERE: メディア タイプの競合が発生しています。リソース メソッド public javax.ws.rs.core.Response com.ppsjamaica.webservices.PPSUsers.getUserById(java.lang.Long) および public javax.ws.rs.core.Response com.ppsjamaica.webservices.PPSUsers.getUserByUsernamePassword( java.lang.String,java.lang.String) は、同じメディア タイプを生成できます。

Uncaught exception from servlet

com.sun.jersey.spi.inject.Errors$ErrorMessagesException at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)

私のサブスクライブクラスは次のとおりです。

   @Path ("/subscriber")
public class Subscribe {

    @GET
    @Produces (MediaType.APPLICATION_JSON)
    public Response getSubscriber (@QueryParam("email")String email)
    {
        EntityManager entityManager = EMF.getInstance ().createEntityManager ();

        /*
         * Sends back a BAD_REQUEST HTTP status
         * if email query parameter is empty
         */
        if (email.isEmpty ())
            return Response.status(Status.BAD_REQUEST).build ();

        try
        {
            Query query = entityManager.createQuery ("SELECT FROM Subscriber WHERE email= :emailParam");
            query.setParameter("emailParam", email);
            return Response.status(Status.OK).entity((Subscriber) query.getSingleResult ()).build (); 
        }
        catch (NoResultException e)
        {
            return Response.status (Status.NOT_FOUND).build ();
        }

    }//end Subscriber method
}

私のログインクラスは次のとおりです。

    @Path ("/login")
public class Login {

    @GET
    @Produces (MediaType.APPLICATION_JSON)
    public User authenticate (@QueryParam("username") String username, @QueryParam("password")String password)
    {
        User user = new User ();
        return user;
    }//end authenticate method


    @GET
    @Path ("/Subscriber")
    @Produces (MediaType.APPLICATION_JSON)
    public Response getSubsriber (@QueryParam("email") String email)
    {
        EntityManager entityManager = EMF.getInstance ().createEntityManager();

        try
        {
            Query query = entityManager.createQuery("SELECT FROM Subscriber WHERE email= :emailParam");
            query.setParameter("emailParam", email);

            Subscriber subscriber = (Subscriber)query.getSingleResult();
            return Response.status(Status.OK).entity(subscriber).build ();
        }
        catch(Exception e)
        {
            throw new RuntimeException (e);
        }
    }//end getSubsriber method
}//end Login class

私のユーザークラスは次のとおりです。

@Path ("/users")
public class Users {


    /**
     * Gets all User objects from datastore. Returns
     * NOT_FOUND HTTP Response status if no result
     * found and OK HTTP Response status if it does with
     * a list of User objects. 
     * 
     * URL: domain-name/services/users/all
     * 
     * @author Mario Dennis
     * @return Response
     */
    @GET
    @Path ("/all")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAllUsers ()
    {
        try
        {
            EntityManager entityManager = EMF.getInstance().createEntityManager();
            Query query = entityManager.createQuery("SELECT FROM User");

            @SuppressWarnings("unchecked")
            List<User> user = (List<User>) query.getSingleResult ();
            GenericEntity<List<User>> entity = new GenericEntity<List<User>>(user){};

            return Response.status(Status.OK).entity(entity).build ();
        }
        catch (NoResultException e)
        {
            return Response.status(Status.NOT_FOUND).build ();
        }
    }//end getAllUsers method



    /**
     * Gets User object with user name and password specified from
     * datastore. Returns NOT_FOUND HTTP Response status if no result
     * found and OK HTTP Response status if it is found and BAD_REQUEST
     * if parameter supplied is empty.
     * a list of User objects. 
     * 
     * URL: domain-name/services/users/{username}&{password}
     * 
     * @author Mario Dennis
     * @return Response
     */
    @GET
    @Produces (MediaType.APPLICATION_JSON)
    public Response getUserByUsernamePassword (@QueryParam("username")String username,@QueryParam("password") String password)
    {
        /*
         * Sends back a BAD_REQUEST HTTP status
         * if email query parameter is empty
         */
        if (username.isEmpty() || password.isEmpty())
            return Response.status(Status.BAD_REQUEST).build ();

        try
        {
            EntityManager entityManager = EMF.getInstance().createEntityManager ();
            Query query = entityManager.createQuery ("SELECT FROM User WHERE user_name= :usernameParam AND password= :passwordParam");
            query.setParameter("usernameParam", username);
            query.setParameter("passwordParam",password);
            User user = (User) query.getSingleResult ();

            return Response.status(Status.OK).entity(user).build ();
        }
        catch (NoResultException e)
        {
            return Response.status(Status.NOT_FOUND).build ();
        }
    }//end getUserByUsernamePassword method



    /**
     * Gets User object with id specified from datastore. 
     * Returns NOT_FOUND HTTP Response status if no result
     * found and OK HTTP Response status if it is found and 
     * BAD_REQUEST if parameter supplied is empty.
     * a list of User objects. 
     * 
     * URL: domain-name/services/users/{id}
     * 
     * @author Mario Dennis
     * @return Response
     */
    @GET
    @Produces (MediaType.APPLICATION_JSON)
    public Response getUserById (@QueryParam("id")Long id)
    {
        /*
         * Sends back a BAD_REQUEST HTTP status
         * if email query parameter is empty.
         */
        if (id == null)
            return Response.status(Status.BAD_REQUEST).build ();

        try
        {
            EntityManager entityManager = EMF.getInstance ().createEntityManager ();
            User user = entityManager.find(User.class,id);

            /*
             * Checks if user was found. Return a NOT_FOUND
             * HTTP status if user was not located. 
             */
            if (user == null)
                return Response.status(Status.NOT_FOUND).build ();

            else
                return Response.status(Status.OK).entity(user).build();
        }
        catch (NoResultException e)
        {
            return Response.status(Status.NOT_FOUND).build ();
        }
    }//end getUserById method




    /**
     * Save User object to database. Return NOT_MODIFIED
     * HTTP status if persisting of object failed. Otherwise
     * return OK HTTP status if it was successful.
     * 
     * URL: domain-name/services/users/{JSON}
     * 
     * @author Mario Dennis
     * @param user
     * @return Response
     */
    @POST
    @Consumes  (MediaType.APPLICATION_JSON)
    public Response saveUser (User user)
    {
        try
        {
            EntityManager entityManager = EMF.getInstance().createEntityManager();
            entityManager.getTransaction ().begin();
            entityManager.persist(user);
            entityManager.getTransaction().commit();

            return Response.status(Status.OK).build ();
        }
        catch(Exception e)
        {
            return Response.status(Status.NOT_MODIFIED).build ();
        }
    }//end saveUser method

}//end Users class

ユーザー クラスを削除してアップロードし直すと、他の 2 つのサービスが再び機能し始めます。これは何が原因ですか?web.xml

 <!-- Jersey Framework mapping -->
   <servlet>
        <servlet-name>RESTful</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>com.ppsjamaica.webservices</param-value>
        </init-param>
  </servlet>
  <servlet-mapping>
        <servlet-name>RESTful</servlet-name>
        <url-pattern>/service/*</url-pattern>
  </servlet-mapping>
    <!-- end Jersey Framework mapping -->
4

2 に答える 2

4

ユーザーが URI にパスワードを入力する必要があるサービスを設計しないでください。

失敗する理由: 両方のメソッドが同じ URI テンプレートを使用します (それぞれが異なるクエリ パラメーターを挿入するという事実は、それらが異なる URI にマップされていることを意味するわけではないことに注意してください -@Path重要なのは注釈の値です - そしてそれは同じです両方のための)。それらを別の URI テンプレートにマッピングして、それらを明確にする必要があります。

于 2012-10-16T14:49:44.237 に答える
0

アプローチでは、から継承するカスタム例外を作成することWebApplicationExceptionです。詳細はこちらでご覧いただけます。RuntimeExceptionコンテナーは、それが予期される動作であるかどうかを認識できないため、直接 a をスローしないでください。

別のアプローチは、カスタム例外 (から直接継承RuntimeException)に注釈を付ける@ApplicationExceptionことですが、これが JAX-RS で行う方法かどうかはわかりません。EJB のみ。

于 2012-10-15T17:57:25.847 に答える