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
Cordialement
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.
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.
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.
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