2014-09-29 4 views
10

Ho classi generate automaticamente in NetBeans con modello RESTful dalle entità, con funzioni CRUD (annotate con POST, GET, PUT, DELETE). Ho un problema con creare il metodo, che dopo aver inserito un'entità dal frontend, vorrei creare per aggiornare una risposta in modo che la mia vista sia automaticamente (o in modo asincrono, se è il termine giusto) l'entità aggiunta.Crea risposta con intestazione posizione in JAX-RS

mi sono imbattuto in questo (esempio) riga di codice, ma scritto in C# (di cui non so nulla):

HttpContext.Current.Response.AddHeader("Location", "api/tasks" +value.Id); 

Utilizzando JAX-RS in Java, c'è comunque di ottenere il HttpContext corrente solo come in C# e per manipolare l'intestazione?

Il più vicino mi è venuto circa è

Response.ok(entity).header("Location", "api/tasks" + value.Id); 

e questo certamente non funziona. Sembra che ho bisogno di ottenere l'attuale HttpContext prima di costruire la risposta.

Grazie per il vostro aiuto.

risposta

30

Penso che vogliate fare qualcosa come Response.created(createdURI).build(). Ciò creerà una risposta con uno stato 201 Created, con createdUri come valore di intestazione posizione. Normalmente questo viene fatto con i POST. Sul lato client, è possibile chiamare Response.getLocation() che restituirà il nuovo URI.

Dal Response API

Tenete a mente per il location si specifica il metodo created:

l'URI della nuova risorsa. Se viene fornito un URI relativo, verrà convertito in un URI assoluto risolvendolo in relazione all'URI della richiesta.

Se non si desidera fare affidamento su percorsi di risorse statiche, è possibile ottenere il percorso corrente uri dalla classe UriInfo. Si potrebbe fare qualcosa di simile

@Path("/customers") 
public class CustomerResource { 
    @POST 
    @Consumes(MediaType.APPLICATION_XML) 
    public Response createCustomer(Customer customer, @Context UriInfo uriInfo) { 
     int customerId = // create customer and get the resource id 
     UriBuilder builder = uriInfo.getAbsolutePathBuilder(); 
     builder.path(Integer.toString(customerId)); 
     return Response.created(builder.build()).build(); 
    } 
} 

Ciò creerebbe la posizione .../customers/1 (o qualunque sia il customerId è), e inviarlo come l'intestazione di risposta

Nota se si desidera inviare l'entità insieme alla risposta, si può semplicemente collegare il entity(Object) alla catena metodo della Response.ReponseBuilder

-1
@POST 
public Response addMessage(Message message, @Context UriInfo uriInfo) throws URISyntaxException 
{ 
    System.out.println(uriInfo.getAbsolutePath()); 

    Message newmessage = messageService.addMessage(message); 

    String newid = String.valueOf(newmessage.getId()); //To get the id 

    URI uri = uriInfo.getAbsolutePathBuilder().path(newid).build(); 

    return Response.created(uri).entity(newmessage).build(); 
} 
+1

si prega di aggiungere una descrizione per la tua risposta e il codice – ztadic91