2012-02-23 8 views
13

Kullanıcı kaynakları içeren basit bir web hizmeti (Jersey ve GlassFish) için iki REST sınıfı var - biri tüm kullanıcılar üzerinde (örneğin, @POSTing için bir fabrika) ve diğeri bireysel kullanıcılarda (ör. @GET, @PUT) , @DELETE). Bunlar sırasıylaPOST sırasında JAX-RS @Path farklı bir kaynağa nasıl sahip olurum?

@Stateless @Path("users") public class AllUsersResource {...} 
@Stateless @Path("user") public class OneUserResource {...} 

adresindedir. AllUsersResource yayın gönderirken ben

http://localhost:8080/.../user/152 

Sorum bunun nasıl olduğunu, mesela yeni Kullanıcı (Response.created(uri).build() aracılığıyla) Location dönmek istiyorum. AllUsersResource @Context UriInfo uriInfo enjekte eder, ancak bu bana @UrmakResource, sadece geçerli çağrı ("kullanıcılar") için bilgi vermez. yolu Sonunda o yansıma kullanmak basitçe çalışan var, ama kırılgan ve kirli olduğunu endişeliyim:

OneUserResource.class.getAnnotation(Path.class).value(); 

Denemek bulunan tek başka şeyler şu idi StackOverflow başarılı olamadı, aranıyor:

  • com.sun.jersey.api.core.ResourceContext
  • javax.ws.rs.core.UriInfo.getMatchedResources()
  • @ javax.inject.Inject OneUserResource oneUserRes;

Herhangi bir yardım müthiş olurdu!

cevap

8

Diğerlerinin bu soruna sahip olması durumunda paylaşmak istediğim hile yapan birkaç javax.ws.rs.core.UriBuilder yöntemi buldum. Bunlar: UriBuilder.fromResource (OneUserResource.class) ve javax.ws.rs.core.UriBuilder.path (Sınıf). Ben tek seferlik çağrısı ikincisi kullandı:

URI newUserUri = uriInfo.getBaseUriBuilder().path(OneUserResource.class).path("/" + user.getId()).build(); 
return Response.created(newUserUri).build(); 
+0

Her iki yöntemde de sorun olması gereken ** kök ** kaynak sınıflarının çalışması. Alt kaynaklardan kullanırsanız çalışmazlar ('IllegalArgumentException' atılır). Bu nedenle, POST isteğini işleyen bir alt kaynak kullandıysanız; ve 'Konum' başlığını içeren bir '201' döndürmek istediniz, hala şanssızsınız :( – curioustechizen

5

sıkı DİNLENME konsepti ile bir kök kaynağı olarak

@POST /users  -> CREATE a single user 
@GET /users  -> READ all users 
@PUT /users  -> UPDATE (REPLACE) all users @@? 
@DELETE /users  -> DELETE all users @@? 

@POST /users/{id} -> CREATE a single user's some other child; @@? 
@GET /users/{id} -> READ a single user 
@PUT /users/{id} -> UPDATE a single user 
@DELETE /users/{id} -> DELETE a single user 
@Path("/users") 
@Stateless 
public class UsersResouce { 

    // /users 
    @POST 
    @Consumes({MediaType.APPLICATION-XML, MediaType.APPLICATION-JSON}) 
    public Response createUser(final User user) { 
     // persist the user here 
     return Response.created("/" + user.getId()).build(); 
    } 

    // /users 
    @GET 
    @Produces({MediaType.APPLICATION-XML, MediaType.APPLICATION-JSON}) 
    public Response readUsers() { 
     //return all users 
    } 

    // /users/{id} 
    @GET 
    @Path("/{user_id: \\d+}") 
    @Produces({MediaType.APPLICATION-XML, MediaType.APPLICATION-JSON}) 
    public Response readUser(
     @PathParam("user_id") final Long userId) { 

     final User persisted = userBean.find(userId); 

     if (persisted == null) { 
      return Response.status(Status.NOT_FOUND).build(); 
     } 

     return Response.ok().entity(persisted).build(); 
    } 

    // /users/{id} 
    @Consumes({MediaType.APPLICATION-XML, MediaType.APPLICATION-JSON}) 
    @PUT 
    @Path("/{user_id: \\d+}") 
    public Response updateUser(
     @PathParam("user_id") final Long userId, 
     final User mergeable) { 

     final User persisted = userBean.find(userId); 

     if (persisted == null) { 
      userBean.persist(mergeable); 
     } else { 
      persist.setName(mergeable.getName()); 
      userBean.merge(persisted); 
     } 

     return Response.status(Status.NO_CONTENT).build(); 
    } 

    // /users/{id} 
    @DELETE 
    @Path("/{user_id: \\d+}") 
    public Response deleteUser(
     @PathParam("user_id") final Long userId) { 

     userBean.delete(userId); 

     return Response.status(Status.NO_CONTENT).build(); 
    } 

    @EJB 
    private UserBean userBean; 
} 
13

Sen UriBuilder.fromresource (kullanabilirsiniz bunu yapabilirsiniz), ancak bu yalnızca sağlanan Kaynak sınıfı bir kök kaynağı ise (bu açıkça javadocs'da belirtilmiştir) çalışır. Bir alt kaynak sınıfında olsanız bile bunu elde etmenin bir yolunu buldum:

@POST 
@Consumes({MediaType.APPLICATION-XML, MediaType.APPLICATION-JSON}) 
public Response createUser(final User user, @Context UriInfo uriInfo) { 
    // persist the user here 
    URI uri = uriInfo.getAbsolutePathBuilder().path(user.getId()).build(); 
    return Response.created(uri).build(); 
} 
+1

bu, http: // localhost: 8080/project/users/152 'yerine http:// localhost: 8080/project/user/152', ikincisi ise SO için gerekli olan şeydir. –

İlgili konular