2012-09-28 29 views
6

Tôi có một tình huống mà tôi cần những điều sau RequestMapping:Làm thế nào để xác định thứ tự ưu tiên RequestMapping

@RequestMapping(value={"/{section}"}) 
...method implementation here... 

@RequestMapping(value={"/support"}) 
...method implementation here... 

Có một mâu thuẫn rõ ràng. Hy vọng của tôi là Spring sẽ tự động giải quyết vấn đề này và ánh xạ /support sang phương thức thứ hai và mọi thứ khác cho phương thức thứ nhất, nhưng thay vào đó, hãy ánh xạ /support sang phương thức đầu tiên.

Tôi làm cách nào để yêu cầu Spring cho phép rõ ràng RequestMapping để ghi đè một số RequestMapping với một số PathVariable ở cùng một vị trí?

Chỉnh sửa 2: Dường như nó sẽ hoạt động nếu ánh xạ /support xuất hiện trước khi ánh xạ /{section}. Thật không may, chúng tôi có hàng chục bộ điều khiển chứa nhiều phương thức với RequestMapping. Làm thế nào tôi có thể đảm bảo rằng bộ điều khiển với ánh xạ /{section} được khởi tạo lần cuối? Hay một kẻ đánh chặn trước sẽ là con đường để đi?

Sửa 1: này được đơn giản hóa, tôi biết rằng có những người một mình hai RequestMapping sẽ không có ý nghĩa nhiều)

+0

Thứ tự trong tệp không có sự khác biệt? – Keppil

+1

@Keppil Chúng có hai tệp khác nhau. –

Trả lời

3

sử dụng mùa xuân, bạn có thể kéo dài tuổi org.springframework.web.HttpRequestHandler để hỗ trợ kịch bản của bạn.

Thực hiện phương pháp này:

@Override 
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} 

Sử dụng nó để phân tích các yêu cầu gửi đến, xác định xem địa chỉ yêu cầu là một phần của tập hợp con đặc biệt của bạn yêu cầu url và chuyển đến vị trí thích hợp.

Ex:

@Override 
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
/** You will want to check your array of values and have this data cached **/ 
if (urlPath.contains("/sectionName")) { 
     RequestDispatcher requestDispatcher = request.getRequestDispatcher("sections" + "/" + urlPath); 
     requestDispatcher.forward(request, response); 
    } 

} 

Và thiết lập các phần của bạn như:

@RequestMapping(value={"/sections/{sectionName}"}) 

này sẽ không can thiệp với bất kỳ ánh xạ điều khiển tồn tại trước đó của bạn.

+0

Giải pháp tuyệt vời. Rock rắn câu trả lời, sẽ trao giải thưởng tiền thưởng một khi trang web cho phép nó. Cảm ơn rất nhiều ddubyat !! –

1

Nếu 2 phương pháp này được định nghĩa trong 2 bộ điều khiển khác nhau vấn đề của bạn là bạn có 2 bộ điều khiển được ánh xạ tới cùng một URL. Bạn không kiểm soát thứ tự của khởi tạo bộ điều khiển ngay bây giờ, do đó, thứ tự là ngẫu nhiên.

Tôi nghĩ bạn cần /support ánh xạ để được khởi chạy trước /{section}.

Để đạt được điều này, hãy thử xác định rằng bộ điều khiển "phần" phụ thuộc vào bộ điều khiển "hỗ trợ". Nếu điều này sẽ không giúp đặt cả hai phương pháp lại với nhau thành một bộ điều khiển và đặt phương thức được ánh xạ tới "hỗ trợ" trước "phần"

Tôi không làm việc này ở đây là đề xuất khác. "Phần" là gì? Nếu nó có thể chấp nhận số lượng giá trị giới hạn, nó phải được định nghĩa là enum. Tôi tin rằng trong trường hợp này mọi thứ sẽ hoạt động theo yêu cầu nếu các phương thức hỗ trợ và phần nằm trong một bộ điều khiển hoặc trong các bộ điều khiển riêng biệt.

Chúc may mắn.

+0

Cảm ơn bạn đã trả lời, Alex. Có rất nhiều "/ x" phương thức 'RequestMapping' nằm rải rác trên nhiều bộ điều khiển. Vì vậy, về cơ bản chúng tôi sẽ cần phải gắn "/ {section}" vào cuối thứ tự khởi tạo. Có cách nào để buộc bộ điều khiển hoặc phương thức đó tải cuối cùng không? –

0

Tôi không thấy hành vi này với Spring 3.1.2, nó có thể có khả năng là một lỗi với phiên bản Spring cũ hơn. Đây là một ý chính chạy qua mà không có bất kỳ vấn đề gì đối với tôi - https://gist.github.com/3802254

+0

Xin cảm ơn, Biju. Trong ý chính của bạn, trước tiên bạn có phương thức 'sample'. Bạn có thể lật thứ tự của hai phương pháp và xem liệu bạn có nhận được kết quả tương tự không? Thứ tự ngược lại là cách chúng ta được thiết lập ... –

+0

Có, đã cố gắng cũng vậy, làm việc với Spring 3.1.2 –

+0

Tôi đánh giá cao bạn đã thử nghiệm điều đó, Biju. Rất tiếc, việc cập nhật lên 3.1.2 không phải là một tùy chọn ngay bây giờ, nhưng điều đó thật đáng khích lệ khi biết rằng nó có thể được giải quyết khi chúng tôi cập nhật. –

1

Điều này không có vẻ là vấn đề, đây là bản đồ hợp lệ. Nếu bạn có một cái nhìn để http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates

Trong phần 16.3.2 Yêu cầu ánh xạ với @RequestMapping tồn tại hai phương pháp làm chính xác giống như bạn đang cố gắng.

Để đảm bảo rằng các lớp học của bạn đang được biên dịch, hãy thử thêm @RequestMapping ("/ someprefix") ở cấp lớp để xem liệu URL có đang được hiển thị như bạn muốn hay không.

Tôi xác minh ví dụ của bạn cục bộ bằng cách sử dụng phiên bản 3.1.0.RELEASE và không có sự cố nào.

Là một workaround (và cũng để cung cấp một cũng hiểu REST của URI thêm một số ngữ cảnh để lập bản đồ thứ hai của bạn:

@RequestMapping(value={"client/support"}) // i.e: if you are working with clients 
public ModelAndView getsupport(@PathVariable Long supportId){ 
    // do your code here something here 
    } 

Tất nhiên rằng đây là hợp lệ nếu điều này là bộ điều khiển độc đáo hiện diện trong hệ thống, nếu không bạn phải sử dụng RequestMapping ở cấp lớp như tôi đã gợi ý ở trên.

tôi hy vọng điều này sẽ giúp.

+0

Đây sẽ là câu trả lời đúng! –

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