2010-05-31 26 views
22

sto usando Jersey in un progetto diREST e sto bisogno di usare espressione regolare.@Path e espressioni regolari (Jersey/REST) ​​

Scavando a questo proposito è semplice come:

@Path("/resources") 
public class MyResource { 

    @GET 
    @Path("{subResources:.*}") 
    public String get(@PathParam("subResources") String subResources) {...} 
} 

Ma, facendo in questo modo, il metodo è sempre richiesta unica se mi passa 1 param, esempio:

GET : .../resources/firstSubResource

Se uso più di 1 parametro del metodo è non ricevendo la richiesta, ad esempio:

GET: .../risorse/firstSubResource/seccondSubResource/thirdSubResource


Sono in grado di utilizzare regex solo se nel mio @Path contiene una variabile o valore di testo, ad esempio:

@Path("{SubResource1}/{subResources:.*}") 

O

@Path("/hardCodeString/{subResources:.*}") 

Oggi ho potuto correre con questa soluzione di una variabile, ma non va bene per il mio punto di vista.


mio web.xml

(...) 
    <servlet> 
     <servlet-name>Jersey Spring Web Application</servlet-name> 
     <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>com.myproject.rest</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Spring Web Application</servlet-name> 
     <url-pattern>/1.0/*</url-pattern> 
    </servlet-mapping> 
(...) 

Domanda

  • Qualcuno ha lavorato con qualcosa legato?
  • Sto facendo qualcosa di sbagliato?
  • Penso che questo potrebbe essere un bug, quando si lavora con più di un @Path, uno nella classe e altro nel metodo.
  • Qualsiasi consiglio è apprezzato!

saluti

+1

Potresti pubblicare ulteriori informazioni, tra cui: i tag e

+0

@Daniel - Grazie per la tua risposta, aggiungo qualche altra informazione alla domanda. Saluti! –

risposta

1

Vuoi essere contrari ad accettare un unico PathParam, rappresenta un insieme di subResources delimitato da qualche segno?

Per esempio ...

@Path("/resources) 
public class MyResource { 

    @GET 
    @Path("{subResources}") 
    public String get(@PathParam("subResources") String subResources) 
    { 
     String[] params = StringUtils.split(subResources, ";"); 
    } 
}

..dovrebbe gestire

 
GET: .../resources/firstSubResource 
& 
GET: .../resources/firstSubResource;seccondSubResource;thirdSubResource 
20

Puoi provare a utilizzare espressioni regolari come indicato nella Overview of JAX-RS 1.1

Codice frammento apparirebbe come sotto per il vostro caso

@Path("resources/") 
public class MyResource { 

    @GET 
    @Path("{subResources: [a-zA-Z0-9_/]+}") 
    public String get(@PathParam("subResources") String subResources) {...} 
} 

Speranza che aiuta.

+0

Se vuoi far corrispondere qualsiasi carattere dopo "resources /", usa il pattern '. +', Ad esempio, '@Path (" {subResources:. +} ")', Poiché il precedente non combacia con gli URL con spazi o punti nel. Ad esempio "/resources/test/me.jpg" non corrisponderebbe. –

+0

e un'altra leggera modifica: se vuoi assicurarti che & non sia incluso nella parte 'subResources', usa il pattern' [^ &?] 'Invece di'. + ' –

6

Puoi provare a rimuovere il tuo @PathParam annotazione e invece ottenere il percorso da UriInfo:

@Context UriInfo uriInfo; 

@GET 
@Path("{subResources:.*}") 
public String get() 
{ 
    String path = uriInfo.getPath(); 
} 

Non so perchè ma funziona nella mia applicazione.

8

So che questa è una domanda molto vecchia, ma l'ho appena trovata mentre cercavo la soluzione per me. Sto cercando di accettare nomi di file in stile s3, ad esempio /folder/whatever/blah/.../image.jpg che potrebbero essere di qualsiasi lunghezza immaginabile e contenere molti / s.

In ogni caso la vostra soluzione:

@Path("/hardCodeString/{subResources:.*}") 

mi ha dato un'idea ... risulta questo funziona:

@Path("/{subResources:.*}") 

preavviso l'iniziale /. Ora forse in tre anni questo è qualcosa che hanno risolto o qualsiasi altra cosa, ma spero che questo aiuti qualcuno come questa pagina sembra essere l'unico posto che menziona questa situazione.