2016-04-24 8 views
1

Ich lerne RESTful Web-Services mit JAX-RS. Ich habe eine MessageResource und eine Sub-Ressource CommentResource.Jersey Sub-Ressource falsch aufrufen

In meinem MessageResource ich Comment Sub Ressource mit Testmethode, die ich in der MessageResource Klasse kommentiert, weil ich nicht CommentResource aufgerufen werden soll.

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(); } 
    */ 
} 

Ich habe Unter Ressource CommentResource, wie folgend:

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; 
    } 

} 

ich eine generische Ausnahme Mapper erstellt, die Throwable Klasse zugeordnet ist. Es wird für den Zweck erstellt, wenn irgendeine Ausnahme am Serverende auftritt, stattdessen wird Tomcat-Fehlerberichtsseite angezeigt, sinnvolle Nachricht sollte gesendet werden.

@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(); 
    } 
} 

Ferner, wenn ich meine allgemeine Ausnahme Mapper bin Prüfung durch eine URL aufruft

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

, die nicht auf ein Verfahren in MessageResource abgebildet wird. Es ist das Aufrufen der CommentResource folgende Methode:

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

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

Wenn ich das obige Verfahren kommentieren ich die richtige Antwort in Postman bin immer.

Kann jemand dieses Verhalten erklären. Danke im Voraus.

Antwort

3

Entfernen Sie @Path("/") aus der CommentResource. Es wird als Root-Ressource hinzugefügt. Wenn Sie also auf /mesa zugreifen, wird CommentResource auf / abgebildet und es trifft die Ressourcenmethode, die @Path("{whatever}") zugeordnet ist.

Unter-Ressourcen-Locator-Klassen sollten @Path nicht haben. Das ist nur für Root-Ressourcenklassen. In einer Sub-Resource-Locator-Anfrage wird diese ignoriert, aber beim Start der App wird sie immer noch wie eine normale Root-Ressource registriert.

+0

Bedeutet Kommentar Ressource arbeitet nicht als Sub-Ressource, anstatt es als unabhängige Ressource arbeitet ?? –

+0

Mit oder ohne '@Path ("/")' funktioniert es immer noch als Unterressourcenklasse, aber der '@ Pfad' wird ignoriert. Wie ich schon sagte, Subresource-Klassen sollten nicht mit '@ Path' versehen sein. Damit wird es auf '/' gemappt. Wenn du das nicht willst, dann entferne den '@Path ("/")' –

+0

ya, es funktioniert sogar nachdem du den @Path von der Kommentarressource entfernt hast. –