簡體   English   中英

添加新服務時,我所有的Restful Web服務都停止了工作

[英]All my Restful web services stopped working when I add new service

好的,我有一個包含兩個寧靜的Web服務類Login.class和Subscribe.class的包。 當我將它們部署到app引擎並測試它們時,它們可以工作。 現在我將新的服務類名稱User s.class添加到包中,現在當我調用它們時,我的服務都無效。我收到內部服務器錯誤。

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

嚴重:產生媒體類型沖突。 資源方法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 com.sun.jersey.spi.inject.Errors.processErrorMessages上的$ ErrorMessagesException(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

當我刪除用戶類並上傳回來時,其他兩個服務再次開始工作。 是什么造成的? 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 -->

請不要設計要求用戶在URI中輸入密碼的服務。

關於它失敗的原因:兩種方法都使用相同的URI模板(請注意,每個方法都注入不同的查詢參數並不意味着它們被映射到不同的URI - 重要的是@Path注釋的值 - 它是兩者都一樣)。 您必須通過將它們映射到不同的URI模板來消除它們的歧義。

方法是創建一個繼承自WebApplicationException的自定義異常; 你可以在這里看到更多細節 您不應該直接拋出RuntimeException因為容器不知道它是否是預期的行為。

另一種方法是用@ApplicationException注釋你的自定義異常(它直接從RuntimeException繼承),雖然我不知道這是否是在JAX-RS中這樣做的方法; 僅在EJB中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM