2016-03-14 18 views
9

tôi phải hỗ trợ sau định dạng URLRequestMapping với dấu gạch chéo và chấm

/service/country/city/addr1/addr2/xyz.atom /service/country/city/addr1/addr2/addr3/xyz.atom

nơi countrycity có thể được ánh xạ tới @PathVariable nhưng sau đó con đường có thể năng động với nhiều nhát chém. Phần cuối sẽ có .atom hoặc tương tự.

tôi đã cố gắng sau, nhưng không ai trong số các tùy chọn dường như được làm việc

  • Wildcard

    @RequestMapping(value="/service/{country}/{city}/**")

  • Regex

    @RequestMapping(value="/service/{country}/{city}/{addr:.+}")

  • Sử dụng SuffixPatternMatch


    phương pháp ghi đè trong Config lớp

    @Override 
    public void configurePathMatch(PathMatchConfigurer configurer) { 
        configurer.setUseSuffixPatternMatch(false); 
    } 
    

Hình như sự kết hợp của dấu gạch chéo và chấm không làm việc với các giải pháp trên. tôi tiếp tục nhận được 406 cho người không phù hợp với Chấp nhận tiêu đề, hoặc 404

+0

Yêu cầu nhận xét lý do cho downvote – sidgate

+1

Xin chào, tôi đã thử tùy chọn đầu tiên của bạn, RequestMapping (value = "/ service/{country}/{city}/**") và hoạt động cho URL động với nhiều dấu gạch chéo – cralfaro

+1

406 không có gì để làm với con đường. Có vẻ như bạn đã làm đúng nhưng bộ điều khiển của bạn không thể phân phối nội dung theo định dạng được yêu cầu. – zeroflagL

Trả lời

2

Cách tiếp cận năng động nhất là sử dụng MatrixVariable để quản lý danh sách địa chỉ nhưng không áp dụng được trong ngữ cảnh của bạn vì đường dẫn không thể sửa đổi theo như tôi hiểu được từ câu hỏi của bạn.

Điều tốt nhất bạn có thể làm để quản lý con đường năng động của bạn là tiến hành theo hai bước:

  1. Đặt một RequestMapping đó trích xuất toàn bộ dữ liệu ngoại trừ địa chỉ
  2. Trích xuất các địa chỉ bằng tay trong các phương pháp

vì vậy, cho bước đầu tiên, bạn sẽ có một cái gì đó như thế:

@RequestMapping(value="/service/{country}/{city}/**/{file}.atom") 
    public String service(@PathVariable String country, 
     @PathVariable String city, @PathVariable String file, 
     HttpServletRequest request, Model model) { 

Ánh xạ này khớp với tất cả các đường dẫn cần thiết và cho phép trích xuất quốc gia, thành phố và tên tệp.

Trong bước thứ hai, chúng tôi sẽ sử dụng những gì đã được chiết xuất để có được các địa chỉ bằng cách làm một cái gì đó như thế này:

String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); 
path = path.substring(String.format("/service/%s/%s/", country, city).length(), 
         path.length() - String.format("%s.atom", file).length()); 
String[] addrs = path.split("/"); 
  1. Đầu tiên chúng tôi trích xuất từ ​​yêu cầu đường dẫn đầy đủ
  2. Sau đó chúng tôi loại bỏ những gì chúng tôi đã trích xuất ở đây đầu và cuối đường dẫn
  3. Sau đó, cuối cùng chúng tôi sử dụng String.split để trích xuất tất cả các địa chỉ

Ở cấp độ này, bạn có mọi thứ bạn cần.

+0

Cảm ơn câu trả lời. Đây là gần nhất tôi có thể nhận được. Chỉ có điều mà thay đổi cần thiết là phần mở rộng ở cuối, đó là biến trong trường hợp của tôi. Do đó ánh xạ yêu cầu cuối cùng trông giống như '@RequestMapping (value ="/service/{country}/{city}/**/{addr}. {Extn} ")' – sidgate

1

Bạn có thể thử này,

@RequestMapping(value="/service/{country}/{city}/{addr:[a-z]+\\\\.(atom|otherExtensions)}") 

Chỉ cần phải chỉ rõ định dạng regex hoàn chỉnh trong đó bạn đang mong đợi một phần mở rộng vào cuối url chẳng hạn như nguyên tử, vì điều này sẽ được diễn giải theo mặc định dưới dạng MediaType theo Mùa xuân.

giải pháp khác là xác định chấp nhận MediaTypes

@RequestMapping(value="/service/{country}/{city}/{addr}", consumes = {MediaType.ATOM, MediaType...}) 

Bạn có thể tạo MediaTypes tùy chỉnh nếu nó không được xác định trước trong mùa xuân.

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