2010-05-31 37 views
22

Tôi đang sử dụng Jersey trong một dự án REST của và tôi cần phải sử dụng biểu thức chính quy.@Path và biểu thức chính quy (Jersey/REST) ​​

Đào về nó là đơn giản như:

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

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

Nhưng, làm như thế này, phương pháp này là nhận được yêu cầu chỉ nếu tôi đi 1 param, ví dụ:

GET : .../resources/firstSubResource

Nếu tôi sử dụng nhiều hơn thì 1 số phương pháp là không nhận được yêu cầu, ví dụ:

GET: .../nguồn/firstSubResource/seccondSubResource/thirdSubResource


Tôi chỉ có thể sử dụng regex nếu trong @Path của tôi chứa biến hoặc giá trị văn bản, ví dụ:

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

Hoặc

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

Hôm nay tôi có thể chạy với giải pháp này của một biến, nhưng không phải là OK cho quan điểm của tôi.


web.xml My

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

Câu hỏi

  • Có ai đã làm việc với một cái gì đó liên quan?
  • Tôi đang làm điều gì đó sai?
  • Tôi nghĩ rằng đây có thể là một lỗi, khi làm việc với nhiều hơn thì một @Path, một trong Lớp và một trong Phương pháp.
  • Bất kỳ mẹo nào được đánh giá cao!

Trân

+1

Bạn có thể đăng thêm thông tin bao gồm: các thẻ từ 'web.xml', URL mẫu, chú thích @Path khớp với từng URL mẫu và tất cả các giá trị của tham số đường dẫn mà Jersey nhận được không? (Chỉnh sửa câu hỏi của bạn để thêm thông tin này.) –

+0

@Daniel - Cảm ơn câu trả lời của bạn, tôi thêm một số thông tin khác cho câu hỏi. Trân trọng! –

Trả lời

1

Bạn có thể trái ngược với việc chấp nhận một PathParam duy nhất, đại diện cho một tập hợp các subResources giới hạn bởi một số dấu hiệu?

Ví dụ ...

@Path("/resources) 
public class MyResource { 

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

..nên xử lý

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

Bạn có thể thử sử dụng biểu thức chính quy như được đưa ra trong Overview of JAX-RS 1.1

đoạn mã sẽ trông như sau đối với trường hợp của bạn

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

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

Hy vọng rằng sẽ giúp.

+0

Nếu bạn muốn kết hợp bất kỳ ký tự nào sau "tài nguyên /", hãy sử dụng mẫu '. +', Ví dụ: '@Path (" {subResources:. +} ")', Vì ở trên không khớp với url có dấu cách hoặc dấu chấm bên trong. Ví dụ: "/resources/test/me.jpg" sẽ không khớp. –

+0

và một sửa đổi nhỏ hơn - nếu bạn muốn đảm bảo rằng & không được bao gồm trong phần 'subResources', hãy sử dụng mẫu' [^ &?] 'Thay vì'. + ' –

6

Bạn có thể thử gỡ bỏ @PathParam chú thích của mình và thay vào đó lấy đường dẫn của UriInfo:

@Context UriInfo uriInfo; 

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

Tôi không biết tại sao nhưng nó hoạt động trong ứng dụng của tôi.

8

Tôi biết đây là một câu hỏi thực sự cũ, nhưng tôi chỉ gặp nó trong khi cố gắng tìm kiếm giải pháp cho bản thân mình. Tôi cố gắng chấp nhận tên tệp kiểu s3, ví dụ: /folder/whatever/blah/.../image.jpg có thể có bất kỳ độ dài nào có thể tưởng tượng và chứa nhiều số / s.

Dù sao giải pháp của riêng bạn:

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

Đã cho tôi một ý tưởng ... Hóa ra làm việc này:

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

thông báo ban đầu /. Bây giờ có thể trong ba năm, đây là thứ mà họ đã sửa chữa hoặc bất cứ điều gì, nhưng tôi hy vọng điều này sẽ giúp một người nào đó vì trang này có vẻ là nơi duy nhất đề cập đến tình trạng khó khăn này.

Các vấn đề liên quan