当RequestMapping中的最后一个PathVariable仅具有Spring控制器时,Spring控制器不起作用

时间:2019-05-31 14:06:59

标签: java spring-mvc

我正在尝试将请求映射到Spring控制器,但未按预期工作

当我尝试/ simple / test / something / .....时出现404错误。 我的映射如下@RequestMapping(path="/simple/test/{string1}/{string2}")

下面是我的代码

@RequestMapping(path = "/search/test/{string1}/{string2}", produces = APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public SearchResult search( @PathVariable String string1, @PathVariable Optional string2) {
    if (!query.isPresent()) {
        return service.getLastQueries(string1, string2);
    }
}

当{string2}包含/或仅....时,我收到404错误。 例如{string2}是.......或某物

3 个答案:

答案 0 :(得分:0)

仅将输入参数设置为Optional还不够,您还应该在required=false注释中设置@PathVariable

@PathVariable(required=false) Optional<String> string2

答案 1 :(得分:0)

正如@DDovzhenko指出的那样,您不能只声明Optional类型。实际上,您根本不应该这样做,因为u期望使用String并应坚持使用。与

结合使用
required=false

@PathVariable的属性应该可以正常工作

@PathVariable(required=false) String urVariable

答案 2 :(得分:0)

感谢您的回复。

但是在我的情况下,第二个字符串有时应该是可选的。我将第二个字符串更改为“ RequestParam”,以便新的URL像这样/simple/test?q=something

新的请求映射将为@RequestMapping(path="/simple/test/{string1}")

所以解决方案代码是

@RequestMapping(path = "/search/test/{string1}", produces = APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public SearchResult search( @PathVariable String string1, @RequestParam Optional<String> string2) {
    if (!string2.isPresent()) {
        return service.getLastQueries(string1, string2);
    }
}