Spring设置默认的PathVariable

时间:2017-01-12 18:27:40

标签: spring

我想以下列格式将参数传递给我的网站服务:

http://.../greetings/neil/1

而不是

http://.../greetings?name=neil&id=1

所以我改变了我的代码(注意,我只包含了代码中的第一个参数):

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
    return new Greeting(counter.incrementAndGet(),
                        String.format(template, name));
}

为:

@RequestMapping
public Greeting greeting(@PathVariable String name) {
    return new Greeting(counter.incrementAndGet(),
                        String.format(template, name));
}

有效,但我不知道如何将默认值添加到@PathVariable,例如:

http://.../greetings/

http://.../greetings/neil/

可以像查询参数一样工作。

我该怎么做?我想也许它会传递null,但它只会产生页面错误。

我想答案可能是添加多个重载,但听起来有点混乱。

感谢。

感谢。

3 个答案:

答案 0 :(得分:5)

以下方式怎么样?我正在使用java.util.Optional类,它充当可以为null或非null的对象的包装。

@RequestMapping
public Greeting greeting(@PathVariable Optional<String> name) {
    String newName = "";  
    if (name.isPresent()) {
        newName = name.get()   //returns the id
    }
    return new Greeting(counter.incrementAndGet(),
                        String.format(template, newName));
}

或者,您可以定义两个单独的请求映射处理程序:

@RequestMapping("/greeting")
public Greeting defaultGreeting()

@RequestMapping("/greeting/{name}")
public Greeting withNameGreeting(@PathVariable String name)

答案 1 :(得分:5)

Spring 5 / Spring Boot 2示例:

@RequestMapping({"/greeting-blocking/{name}","/greeting-blocking/"})
public ResponseEntity<User> greetingBlocking(
        @PathVariable(name = "name", required = false) String name) {
    String username = StringUtils.isEmpty(name) ? "anonymous" : name;
    return ResponseEntity.ok().body(User.create(username));
}

@RequestMapping({"/greeting-reactive/{name}","/greeting-reactive/"})
public Mono<ResponseEntity<User>> greetingReactive(
        @PathVariable(name = "name", required = false) String name) {
    String username = StringUtils.isEmpty(name) ? "anonymous" : name;
    return userReactiveRepo.findByName(username).map(user -> ResponseEntity.ok().body(user));
}

答案 2 :(得分:1)

一个班轮

    @RequestMapping
    public Greeting greeting(@PathVariable Optional<String> name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name.orElseGet(() -> "World")));
    }