相关疑难解决方法(0)

Spring MVC @PathVariable被截断了

我有一个控制器,提供对信息的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吗?

java rest spring get spring-mvc

135
推荐指数
7
解决办法
7万
查看次数

SpringMVC:取决于url扩展名的映射行为不一致

我有一个基于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-mvc spring-4

9
推荐指数
1
解决办法
2421
查看次数

获取请求仅适用于尾部斜杠(弹簧 REST 注释)

我有一个 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”...... …

java rest spring annotations trailing-slash

5
推荐指数
1
解决办法
4260
查看次数

标签 统计

java ×2

rest ×2

spring ×2

spring-mvc ×2

annotations ×1

get ×1

spring-4 ×1

trailing-slash ×1