2016-04-24 5 views
1

JAX-RSを使用してRESTful Webサービスを学習しています。 私はMessageResourceとサブリソースCommentResourceを持っています。ジャージがサブリソースを誤って呼び出す

私のMessageResource私はが呼び出されることを望まないので、MessageResourceクラスにコメントしたテストメソッドでコメントサブリソースをマップしました。

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 MessageResource内の任意のメソッドにマップされていない

http://localhost:8080/messenger/webapi/messa

を呼び出すことによって、私の一般的な例外マッパーをテストしていたとき。私はポストマンで適切な応答を取得しています上記の方法をコメントする場合

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

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

:それはCommentResource次のメソッドを呼び出しています。

誰でもこの動作を説明できます。前もって感謝します。

答えて

3

CommentResourceから@Path("/")を削除します。これはルートリソースとして追加されています。したがって、/mesaにアクセスすると、CommentResource/にマップされ、@Path("{whatever}")にマップされたリソースメソッドをヒットします。

サブリソースロケータクラスは、@Pathであってはなりません。これは、ルートリソースクラスの場合のみです。サブリソースロケータリクエストでは無視されますが、アプリの起動時には通常のルートリソースのように登録されます。

+0

コメントリソースは、独立したリソースとして機能しているのではなく、サブリソースとして機能していませんか? –

+0

'@Path("/")"の有無にかかわらず、まだサブリソースクラスとして動作しますが、 '@ Path'は無視されます。私が言ったように、サブリソースクラスには '@ Path'というアノテーションを付けるべきではありません。これで '/'にマップされます。あなたがそれを望まないなら、 '@Path("/")' –

+0

を削除してください。コメントリソースから@Pathを削除した後でも動作します。 –

関連する問題