簡體   English   中英

澤西錯誤地調用子資源

[英]Jersey invoking sub resource wrongly

我正在使用JAX-RS學習RESTful Web服務。 我有一個MessageResource和一個子資源CommentResource

在我的MessageResource我使用測試方法映射了注釋子資源,我在MessageResource類中進行了注釋,因為我不希望調用CommentResource

package org.kaushik.javabrains.messenger.resource;

import java.net.URI;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import org.glassfish.jersey.server.Uri;
import org.kaushik.javabrains.messenger.exception.DataNotFoundException;
import org.kaushik.javabrains.messenger.model.Message;
import org.kaushik.javabrains.messenger.services.MessageService;

@Path("/messages")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class MessageResource {

    public MessageResource() {
        // TODO Auto-generated constructor stub
    }

    @GET
    public List<Message> getAllMessage() {

        MessageService obj = new MessageService();
        return obj.getAllMessages();
    }

    @GET
    @Path("/{messageId}")
    public Message getMessageById(@PathParam("messageId") String messageId) {

        MessageService obj = new MessageService();
        Message retrivedMessage = obj.getMessage(Long.parseLong(messageId));
        return retrivedMessage;
    }

    /*
     * This method is used to add new message in database returns created
     * message with generated id
     */
    /*
     * @POST public Message postMessage(Message msg){
     * 
     * MessageService obj = new MessageService(); msg = obj.addMessage(msg);
     * 
     * return msg; }
     */

    /**
     * This method created the new message and sends new message with 201 status
     * code using Response
     * 
     * @param msg
     * @return
     */
    @POST
    public Response postMessage(Message msg, @Context UriInfo uriInfo) {

        MessageService obj = new MessageService();
        msg = obj.addMessage(msg);
        // This is to send only created status
        // return Response.status(Status.CREATED).entity(msg).build();

        // If we want to send status + new created resource path

        String newId = msg.getId() + "";
        URI uri = uriInfo.getAbsolutePathBuilder().path(newId).build();
        return Response.created(uri).entity(msg).build();
    }

    @PUT
    @Path("/{messageId}")
    public Message updateMessage(Message msg, @PathParam("messageId") long id) {

        MessageService obj = new MessageService();
        msg.setId(id);
        msg = obj.updateMessage(msg);

        return msg;
    }

    @DELETE
    @Path("/{messageId}")
    public void deleteMessage(@PathParam("messageId") long id) {

        MessageService obj = new MessageService();
        obj.removeMessage(id);
    }

    /**
     * This method is invoked if url asked for comments irrespective of http
     * method, it will invoke the CommentResource which is a sub resouce of
     * Message
     * 
     * @return
     */
    /*
     * @Path("/{messageId}/comments") public CommentResource test() { return new
     * CommentResource(); }
     */
}

我有子資源CommentResource如下:

package org.kaushik.javabrains.messenger.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/")
public class CommentResource {

    public CommentResource() {
        // TODO Auto-generated constructor stub
    }

    @GET
    public String test() {

        return "new sub resource";
    }

    @GET
    @Path("/{commentId}")
    public String getCommentById(@PathParam("messageId") String messageId, @PathParam("commentId") String commentId) {

        return commentId + " This is dummy comment for messageID=" + messageId;
    }

}

我創建了一個通用的異常映射器,它映射到Throwable類。 它是為此目的而創建的,如果在服務器端發生任何異常,而不是顯示Tomcat錯誤報告頁面,則應發送有意義的消息。

@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable ex) {
        System.out.println("in Genereic mapper");
        ErrorMessage message = new ErrorMessage(ex.getMessage(),"/Messenger/documentation",500);
        return Response.status(Status.INTERNAL_SERVER_ERROR).entity(message).build();
    }
}

此外,當我通過調用url測試我的通用異常映射器時

HTTP://本地主機:8080 /信使/的WebAPI / MESSA

它沒有映射到MessageResource任何方法。 它正在調用CommentResource以下方法:

@GET
@Path("/{commentId}")
public String getCommentById(@PathParam("messageId") String messageId, @PathParam("commentId") String commentId) {

    return commentId + " This is dummy comment for messageID=" + messageId;
}

如果我評論上述方法,我會在Postman中得到適當的回應。

任何人都可以解釋這種行為。 提前致謝。

CommentResource刪除@Path("/") 它被添加為根資源。 因此,當您訪問/mesaCommentResource將映射到/ ,並且它將命中映射到@Path("{whatever}")的資源方法。

子資源定位器類不應該有@Path 這僅適用於根資源類。 在子資源定位器請求中,它將被忽略,但在應用程序啟動時,它仍然像常規根資源一樣注冊。

暫無
暫無

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

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