2015-11-12 107 views
1

字符串參數我有兩個參數長字符串一個Spring控制器:RequestMapping包含URL

@RequestMapping(value = "/webpage") 
@Controller 
public class WebpageContentController { 
//... 
    @RequestMapping(value = "{webpageId}/{webpageAddress}", method = RequestMethod.GET) 
    public String contentWebpageById(@PathVariable long webpageId, @PathVariable String webpageAddress) { 
     System.out.println("webpageId=" + webpageId); 
     System.out.println("webpageAddress=" + webpageAddress); 
     //... 
    } 
//... 

如果我調用它是這樣的:

http://localhost:8080/webarch/webpage/1/blahblah 

一切都很好:

webpageId=1 
webpageAddress=blahblah 

但是,如果我用斜線傳遞String參數(在本例中爲URL地址):

http://localhost:8080/webarch/webpage/1/https://en.wikipedia.org/wiki/Main_Page 

我得到一個錯誤:

org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [/webarch/webpage/1/https://en.wikipedia.org/wiki/Main_Page] in DispatcherServlet with name 'appServlet' 

如何通過這樣的參數?

+0

有沒有簡單的方法來做到這一點。 WebMVC維護者明確拒絕支持它的請求。 – chrylis

回答

3

嘛錯誤是由彈簧控制器映射造成的,春節時看到的網址一樣

http://localhost:8080/webarch/webpage/1/https://en.wikipedia.org/wiki/Main_Page 

它並不「知道」的「https://en.wikipedia.org/wiki/Main_Page」應該被映射爲參數設置爲「{webpageId}/{ webpageAddress}「映射,因爲每個斜槓都被解釋爲更深的控制器方法映射。它看起來對控制器的方法映射像(webpage/1/http:{anotherMapping}/wiki{anotherMapping}/Main_Page{anotherMapping})至極這種映射顯然是不被處理的「{webpageId}/{webpageAddress}」

編輯

根據您的評論,你可以嘗試這樣的事情

@RequestMapping(value = "/{webpageId}/**", method = RequestMethod.GET) 
public String contentWebpageById(HttpServletRequest request) { 

    String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); 

    String extractedPathParam = pathMatcher.extractPathWithinPattern(pattern, request.getServletPath()); 
    extractedPathParam = extractedPathParam.replace("http:/", "http://"); 
    extractedPathParam = extractedPathParam.replace("https:/", "https://"); 
    //do whatever you want with parsed string.. 
} 

使用Spring 4.2.1

SomeParsing應該使用一些正則表達式只提取URL '變量'

+0

我想做這樣的GET方法(不要發佈):'https://web.archive.org/web/20150609000851/http:// en.wikipedia.org/wiki/Main_Page' 有沒有辦法去做這個?也許用'*'或自定義'@ RequestMapping'進行值映射? – mkczyk

+0

@ mk321是否適合你? –

+0

是的這項工作,謝謝。但有了這個解決方案,我必須解析URL,因爲我得到了'/ webarch/webpage/1/https:// en.wikipedia.org/wiki/Main_Page'而不是'https://en.wikipedia.org/wiki/Main_Page '。 [Here](http://stackoverflow.com/a/2335449/2442133)我找到了解決方案,給了我'https:/ en.wikipedia.org/wiki/Main_Page'。我不知道爲什麼'https://'替換爲'https:/'(少一個斜槓)。 – mkczyk

1

只需編碼URL中的所有特殊字符即可。

https://en.wikipedia.org/wiki/Main_Page 

變成這樣:

https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FMain_Page 

,你可以把它作爲URL參數沒有任何問題。解碼是自動完成的,因此如果您在控制器中以變量的形式訪問參數,它將包含已解碼的URL,您可以在不需要進行任何轉換的情況下使用它。

有關URL編碼的更多信息:https://en.wikipedia.org/wiki/Percent-encoding