2012-01-09 30 views
5

Tôi muốn để có thể truy cập vào các URL còn lại như sau:Jersey có hỗ trợ ký hiệu đô la trong chú thích Đường dẫn của JAX-RS không?

URL đầu tiên hoạt động tốt. Tôi gặp sự cố với URL $ count sử dụng triển khai JAX-RS của Jersey.

Đây là mã cho tài nguyên.

@Path("/helloworld") 
public class HelloWorldResource { 
    @GET 
    @Produces("text/plain") 
    public String getClichedMessage() { 
     return "Hello World!"; 
    } 

    @GET 
    @Path("\\$count") 
    @Produces("text/plain") 
    public String getClichedMessage(
      @PathParam("\\$count") String count) { 

     return "Hello count"; 
    } 
} 

Tôi cũng đã thử "$ count" trong cả @Path và @PathParam nhưng điều đó cũng không hoạt động.

Lưu ý: Nếu tôi xóa ký hiệu đô la khỏi tất cả mã ở trên thì nó hoạt động tốt cho URL localhost: 9998/helloworld/count. Tuy nhiên, tôi cần ký hiệu đô la để có trong URL vì đây sẽ là một ứng dụng sản xuất OData.

+1

Tôi chắc rằng ký hiệu $ có ý nghĩa ngữ nghĩa trong thông số mã hóa URL. Tôi không thể tưởng tượng rằng bạn có thể sử dụng nó trong một URL thông thường mà không cần mã hóa nó. – Perception

+1

Ký hiệu đô la là hợp pháp để sử dụng trong URL mà không cần mã hóa. Nó được sử dụng nhiều trong Giao thức Dữ liệu Mở, là một giao thức dựa trên phần còn lại. Xem [link] (http://www.odata.org/developers/protocols/uri-conventions) – Jerome

Trả lời

3

Tìm thấy câu trả lời. Đặt dấu đô la trong một lớp nhân vật đã làm các trick.

@GET 
@Path("{count : [$]count(/)?}") 
@Produces("text/plain") 
public String getClichedMessageCount(
     @PathParam("count") String count) { 

    return "Hello count"; 
} 

Ở trên phù hợp với các URL sau.

  • localhost: 9998/helloworld/$ đếm
  • localhost: 9998/helloworld/$ count/
  • localhost: 9998/helloworld/$ đếm $ filter = blah
  • localhost: 9998/helloworld/$ count /? $ filter = blah
+0

Cảm ơn bạn rất nhiều !!! Tôi đã dành tất cả buổi sáng cố gắng để làm điều này. – Montecarlo

1

dấu hiệu Dollar là ký tự đặc biệt trong URL, và cần phải được mã hóa như vậy, tôi sợ:

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

Nhân vật bạn đang tìm kiếm là% 24, nếu bạn quan tâm , mặc dù nếu bạn đang sử dụng java, việc đọc lên lớp java.net.URI có thể đáng giá. Tôi đã không chơi với Jersey, nhưng Java là nhiều hơn khả năng làm công việc khó khăn cho bạn ở đây.

+1

Mã hóa ký hiệu đô la là không bắt buộc. Ký hiệu đô la được xác định là ký tự dành riêng trong URI RFC, RFC 3986 [¹] (http: // công cụ.ietf.org/html/rfc3986#section-2.2 "RFC 3986 sec. 2.2") vì nó có ý nghĩa đặc biệt đối với một số lược đồ URI cụ thể (đặc biệt là 'gopher:'). Nó không có ý nghĩa đặc biệt trong lược đồ 'http:' URI. – MetaEd

+0

Rohaq, tôi tin rằng MetaEd là chính xác. Xem [Giao thức dữ liệu mở] (http://www.odata.org/developers/protocols/uri-conventions) đối với giao thức dựa trên phần còn lại, sử dụng nhiều dấu đô la trong URL. – Jerome

+0

Ah, ok, sai lầm của tôi sau đó! Nó có lẽ vẫn có giá trị mã hóa URI đúng cách để tránh các vấn đề khác. – Rohaq

0

Bạn đang sử dụng dấu gạch chéo sai trong @Path

@GET 
@Path("/$count") 
@Produces("text/plain") 
public String getClichedMessage(
     @PathParam("\\$count") String count) { 

    return "Hello count"; 
} 

Ngoài ra đó không phải là cách chính xác để sử dụng PathParam. Nếu bạn đang cố gắng để lấy giá trị sau/helloworld bạn nên làm như sau

@GET 
@Path("/{$count}") 
@Produces("text/plain") 
public String getClichedMessage(
     @PathParam("$count") String count) { 

    return "Hello count"; 
} 

Sửa Không thể lấy nó để làm việc với một $

@Path("count") // works 
@Path("/count") // works 
@Path("\\count") // does not work 
@Path("$count") // does not work 
@Path("/$count") // does not work 
+0

Xin chào Michael. Đã thử ví dụ mã đầu tiên bạn đề xuất nhưng nó không hoạt động. Ví dụ thứ hai không áp dụng được vì tôi cần phải khớp với chuỗi "$ count" theo nghĩa đen. – Jerome

+0

@Jerome Bạn nói đúng, nó vẫn không hoạt động sau khi sửa dấu gạch chéo. –

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