web-dev-qa-db-fra.com

@Path et expression régulière (Jersey / REST)

J'utilise Jersey dans un projet RESTE et j'ai besoin d'utiliser expression régulière.

Creuser à ce sujet est simple comme:

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

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

Mais, en faisant comme ça, la méthode obtient la requête seulement si je passe 1 param, exemple:

OBTENIR: .../resources/firstSubResource

Si j'utilise plus de 1 paramètre, la méthode est pas obtenir la demande, exemple:

OBTENIR: .../resources/firstSubResource/seccondSubResource/thirdSubResource


Je ne peux utiliser l'expression régulière que si mon @Path contient un variable ou valeur de texte, exemple:

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

Ou

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

Aujourd'hui, je pourrais exécuter avec cette solution d'une variable, mais ce n'est pas OK pour mon point de vue.


Mon 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>
(...)

Question

  • Quelqu'un a-t-il travaillé avec quelque chose de similaire?
  • Je fais quelque chose de mal?
  • Je pense que cela pourrait être un bug, lorsque vous travaillez avec plus d'un @Path, un dans la classe et un autre dans la méthode.
  • Tous les conseils sont appréciés!

Cordialement

23
rafa.ferreira

Pouvez-vous essayer d'utiliser une expression régulière comme indiqué dans Présentation de JAX-RS 1.1

L'extrait de code ressemblerait à votre cas ci-dessous

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

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

J'espère que cela pourra aider.

21
jaga

Je sais que c'est une très vieille question, mais je l'ai rencontrée en essayant de trouver la solution pour moi. Im essayant d'accepter les noms de fichiers de style s3, par exemple /folder/wwhat/blah/.../image.jpg qui pourraient être de n'importe quelle longueur imaginable et contenir de nombreux /s.

Quoi qu'il en soit, votre propre solution:

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

M'a donné une idée ... s'avère que cela fonctionne:

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

remarquez le /. Maintenant, peut-être que dans trois ans, c'est quelque chose qu'ils ont corrigé ou autre chose, mais j'espère que cela aide quelqu'un, car cette page semble être le seul endroit qui mentionne cette situation difficile.

9
paullth

Pouvez-vous essayer de supprimer votre annotation @ PathParam et obtenir à la place le chemin par riInfo:

@Context UriInfo uriInfo;

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

Je ne sais pas pourquoi mais cela fonctionne dans mon application.

6
user306708

Seriez-vous opposé à l'acceptation d'un seul PathParam, représentant une collection de sous-ressources délimitées par un jeton?

Par exemple ...

@Path ("/ resources) 
 Public class MyResource {
 
 @GET 
 @Path (" {subResources} ") 
 Public String get (@PathParam ("subResources") String subResources) 
 {
 String [] params = StringUtils.split (subResources, ";"); 
} 
}

.. devrait gérer

 GET: .../resources/firstSubResource 
 & 
 GET: .../resources/firstSubResource; seccondSubResource; thirdSubResource 
0
P. Deters