2010-05-31 12 views
22

estoy usando Jersey en un proyecto RESTO y estoy necesidad de utilizar expresión regular.@Path y expresiones regulares (Jersey/DESCANSO)

de excavación en ello es tan simple como:

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

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

Pero, haciendo de esta manera, el método está recibiendo la solicitud única si pases 1 PARAM, ejemplo:

GET : .../resources/firstSubResource

Si utilizo más de 1 parámetro del método es no conseguir la petición, ejemplo:

GET: .../resources/firstSubResource/seccondSubResource/thirdSubResource


Solo puedo usar expresiones regulares si en mi @Path contiene una variable o valor de texto, ejemplo:

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

O

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

Hoy podía correr con esta solución de una variable, pero no está bien para mi punto de vista.


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

Pregunta

  • ¿Alguien ha trabajado con algo relacionado?
  • Estoy haciendo algo mal?
  • Creo que esto podría ser un error, al trabajar con más de un @Path, uno en la clase y otro en el método.
  • ¡Cualquier consejo es apreciado!

Saludos

+1

¿Podría publicar más información, incluidas las etiquetas y de 'web.xml', ejemplos de URL, la anotación @Path que coincidía con cada URL de muestra y todos los valores de los parámetros de ruta que Jersey recibió? (Edite su pregunta para agregar esta información.) –

+0

@Daniel - Gracias por su respuesta, agrego más información a la pregunta. ¡Saludos! –

Respuesta

1

¿Quieres que se oponen a la aceptación de una sola PathParam, lo que representa una colección de subResources delimitado por alguna señal?

Por ejemplo ...

@Path("/resources) 
public class MyResource { 

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

..debe manejar

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

Se puede tratar usando expresiones regulares como se da en Overview of JAX-RS 1.1

fragmento de código sería de la siguiente manera para su caso

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

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

Espero que ayude.

+0

Si desea hacer coincidir cualquier carácter después de "resources /", use el patrón '. +', Por ejemplo, '@Path (" {subResources:. +} ")', Ya que lo anterior no coincidirá con las URL con espacios o períodos en el. Por ejemplo, "/resources/test/me.jpg" no coincidiría. –

+0

y una pequeña modificación más - si quiere asegurarse de que & no está incluido en la parte 'subResources', use el patrón' [^ &?] 'En lugar de'. + ' –

6

Se puede tratar de retirar a su @PathParam anotación y en lugar de obtener la ruta por UriInfo:

@Context UriInfo uriInfo; 

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

No sé por qué pero funciona en mi solicitud.

8

Sé que esta es una pregunta muy antigua, pero acabo de encontrarla mientras trato de buscar la solución por mi cuenta. Estoy tratando de aceptar nombres de archivos de estilo s3, por ejemplo, /folder/whatever/blah/.../image.jpg que podrían ser de cualquier longitud concebible y contienen muchos / s.

De todos modos su propia solución:

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

me dio una idea ... resulta que esto funciona:

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

notificación inicial del /. Ahora quizás en tres años esto es algo que han arreglado o lo que sea, pero espero que esto ayude a alguien, ya que esta página parece ser el único lugar que menciona esta situación.

Cuestiones relacionadas