2016-04-24 2 views
1

Я изучаю веб-службы RESTful, используя JAX-RS. У меня есть 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://localhost:8080/messenger/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; 
} 

Если я комментирую вышеупомянутый метод я получаю надлежащего ответа в Почтальон.

Может кто-нибудь объяснить это поведение. Заранее спасибо.

ответ

3

Удалить @Path("/") с CommentResource. Он добавляется в качестве корневого ресурса. Поэтому, когда вы обращаетесь к /mesa, CommentResource отображается в /, и он попадает в метод ресурсов, отображаемый на @Path("{whatever}").

Классы локатора вспомогательных ресурсов не должны иметь @Path. Это только для классов ресурсов root. В запросе локатора подресурса он будет проигнорирован, но при запуске приложения он все равно регистрируется как обычный корневой ресурс.

+0

Ресурс комментариев комментариев не работает как вспомогательный ресурс, а не работает как независимый ресурс? –

+0

С или без '@Path ("/")' все равно будет работать как класс подресурсов, но '@ Path' игнорируется. Как я уже сказал, классы субресурсов не должны быть аннотированы с помощью '@ Path'. При этом он будет отображаться на '/'. Если вы этого не хотите, удалите '@Path ("/")' –

+0

ya, его работу даже после удаления @Path из ресурса комментариев. –

Смежные вопросы