RequestMapping包含包含URL的String参数

时间:2015-11-12 00:57:13

标签: java spring webpage request-mapping

我有一个带有两个参数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'

如何通过这样的参数?

2 个答案:

答案 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