我有一个带有两个参数long和String的Spring控制器:
@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 :(得分:3)
当Spring看到像
这样的url时,错误是由spring控制器映射引起的object obj = cmd.ExecuteScalar();
string str = obj.ToString();
account = int.Parse(str);
它不知道'那个' https://en.wikipedia.org/wiki/Main_Page'应该作为参数映射到" {webpageId} / {webpageAddress}"映射,因为每个斜杠都被解释为更深层的控制器方法映射。它寻找像http://localhost:8080/webarch/webpage/1/https://en.wikipedia.org/wiki/Main_Page
这样的控制器方法映射,这种映射显然不是由" {webpageId} / {webpageAddress}"
修改强>
根据您的评论,您可以尝试这样的事情
(webpage/1/http:{anotherMapping}/wiki{anotherMapping}/Main_Page{anotherMapping})
使用spring 4.2.1
SomeParsing应该使用一些正则表达式来仅提取URL'变量'
答案 1 :(得分:1)
只需对网址中的所有特殊字符进行编码即可。
https://en.wikipedia.org/wiki/Main_Page
成为这个:
https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FMain_Page
您可以将其作为URL参数传递而不会出现任何问题。解码是自动完成的,因此如果您在控制器中将参数作为变量访问,它将包含已解码的URL,您可以在不需要任何转换的情况下使用它。
有关网址编码的更多信息:https://en.wikipedia.org/wiki/Percent-encoding