我有一个控制器,提供对信息的RESTful访问:
@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")
public ModelAndView getBlah(@PathVariable String blahName, HttpServletRequest request,
HttpServletResponse response) {
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,如果我使用带有特殊字符的路径变量命中服务器,它将被截断.例如: http:// localhost:8080/blah-server/blah/get/blah2010.08.19-02:25:47
参数blahName将是blah2010.08
但是,对request.getRequestURI()的调用包含传入的所有信息.
知道如何防止Spring截断@PathVariable吗?
我有一个基于RESTful spring的端点,可以将存储在db中的资源存储到javascript编辑器中.相关部分归结为:
@RestController
@RequestMapping(ThemeEndpoint.ENDPOINT_NAME)
public class ThemeEndpoint {
public static final String ENDPOINT_NAME = "/themes";
@RequestMapping(value="/{id}/css/{assetName:.*}", method=RequestMethod.GET)
public Asset getCssItem(
@PathVariable("id") ThemeId id,
@PathVariable("assetName") String name) {
CssThemeAsset themeAsset = themeService.getCssAsset(
id, ThemeAssetId.fromString(name));
Asset asset = new Asset();
asset.name = themeAsset.getName();
asset.text = themeAsset.getContent();
return asset;
}
Run Code Online (Sandbox Code Playgroud)
对于像这样的网址,这可以正常工作
http://localhost:8080/app-url/rest/themes/ac18a080-a2f1-11e3-84f4-600308a0bd14/css/main.less
Run Code Online (Sandbox Code Playgroud)
但是一旦我将扩展名更改为,就会失败.css.
经过一些调试后,我非常确定如果我使用的是url,请求甚至都没有映射
http://localhost:8080/app-url/rest/themes/ac18a080-a2f1-11e3-84f4-600308a0bd14/css/main.css
Run Code Online (Sandbox Code Playgroud)
对于高日志级别,我可以看到映射是由spring捕获的:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
- Mapped "{[/themes/{id}/css/{assetName:.*}],methods=[GET],params=[],headers=[],
consumes=[],produces=[application/json],custom=[]}"
onto public xxx.endpoint.ThemeEndpoint$Asset
xxx.endpoint.ThemeEndpoint.getCssItem(
net.lacho.svc.themes.api.ThemeId,java.lang.String)
Run Code Online (Sandbox Code Playgroud)
并且使用非.css扩展名调用控制器:
Found 1 matching mapping(s) for [/themes/ac18a080-a2f1-11e3-84f4-600308a0bd14/css/main.less]
: [{[/themes/{id}/css/{assetName:.*}],methods=[GET],params=[],headers=[],
consumes=[],produces=[application/json],custom=[]}]
Run Code Online (Sandbox Code Playgroud)
但是只要我使用.css作为扩展名 - bang:
Looking up …Run Code Online (Sandbox Code Playgroud) 我有一个 Spring REST 控制器:
@RestController
@RequestMapping(value = "/myresource")
public class MyResourceController {
...
}
Run Code Online (Sandbox Code Playgroud)
使用 GET 请求方法:
@RequestMapping(method = GET, value = "/{value1}/{value2}/{value3}", produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8")
public ResponseEntity<MyResponseType> getMyResource(
@ApiParam(value = "...",...)
@PathVariable("value1") String value1,
@ApiParam(value = "...",...)
@PathVariable("value2") String value2,
@ApiParam(value = "...",...)
@PathVariable("value3") String value3) {
//...
}
Run Code Online (Sandbox Code Playgroud)
我希望这个方法可以通过以下方式调用:
http://myserver:8080/myresource/value1/value2/value3
Run Code Online (Sandbox Code Playgroud)
但它只能通过斜杠到达:
http://myserver:8080/myresource/value1/value2/value3/
Run Code Online (Sandbox Code Playgroud)
为什么会这样或者是什么导致了这种情况?
Swagger 假设没有尾部斜杠,我现在无法使用 swagger 发送请求。
我该怎么做才能使第一个 URL 工作而不使第二个 URL 工作?
非常感谢您的评论和回答。
编辑 2:
我发现没有斜线 value3 的信息是不完整的。value3 必须是电子邮件地址,但从最后一个点开始的所有内容都被切断了。因此,我收到的不是“myemail@something.de”,而是“myemail@something”。
这解释了为什么我无法获得正确的结果(无内容和 HTTP 状态代码 404)。但我仍然不明白为什么会发生这种情况。此外,如果我的电子邮件地址在顶级域(如 .com)中包含三个字母,则请求永远不会到达 GET 方法“getMyResource”...... …