使用Spring将@PathVariable绑定到JavaBean

3
我尝试在Spring控制器中绑定一个对象,以便可以将其用作@PathVariable。我之所以想这样做,是因为有一些@PathVariable需要传递。我已经尝试了在Spring中绑定路径变量到自定义模型对象是否可以将路径变量和请求参数绑定到单个对象中的解决方案。但两者都不起作用。
我在我的控制器中创建了以下内容。
@RestController
@RequestMapping("/buildings")
@RequiredArgsConstructor
public class BuildingController {

    private final BuildingService buildingService;

    @GetMapping("/{buildingId}/floors/{floorId}/rooms/{roomId}/sections")
    public Flux<SectionDTO> getRoomSections(BuildingRequestBean request) {
        return this.buildingService.getRoomSections(request);
    }
}

以及像 BuildingRequestBean.java 这样的文件

@Getter
@Setter
public class BuildingRequestBean {

  private String buildingId;

  private String floorId;

  private String roomId;
}

当我使用GET localhost:8080/buildings/a/floors/b/rooms/c/sections调用BuildingRequestBean时,属性为null。然而,如果像这样使用@RequestParam调用它,GET localhost:8080/buildings/{buildingId}/floors/{floorId}/rooms/{roomId}/sections?buildingId=a&floorId=b&roomId=c,则不会为null。
如何修复它,使其表现得像@PathVariable而不是像@RequestParam

我也遇到了同样的问题,使用的是2.3.2.RELEASE版本。你解决了这个问题吗? - anubhava
没有,我还没有找到任何解决方案。 - alcantula
是的,可能在当前的Spring版本中没有办法。我正在手动绑定变量,然后通过代码调用验证。 - anubhava
2个回答

0

您可以使用@ModelAttribute来获取它。

尝试使用以下代码:

@GetMapping("/{buildingId}/floors/{floorId}/rooms/{roomId}/sections")
    public Flux<SectionDTO> getRoomSections(@ModelAttribute BuildingRequestBean request) {
        return this.buildingService.getRoomSections(request);
    }

1
我尝试添加@ModelAttribute,但是它没有起作用。 - alcantula
你使用Spring Boot还是Spring? - GolamMazid Sajib
1
我使用的是Spring Boot 2.2,但它无法正常工作,仍然像@RequestParam一样。 - alcantula
如果您调用此URL“localhost:8080/buildings/a/floors/b/rooms/c/sections”,则映射应该可以正常工作。我已在本地进行了测试。 - GolamMazid Sajib

-1

函数参数中必须添加 PathVariable

尝试这样做:

@GetMapping("/{buildingId}/floors/{floorId}/rooms/{roomId}/sections")
public Flux<SectionDTO> getRoomSections(@PathVariable String buildingId,@PathVariable String floorId ,@PathVariable String roomId) {

3
如果@PathVariable太多,会导致控制器变得混乱。我希望@PathVariable可以被封装在一个对象中。 - alcantula
使用JSON请求 {buildingId: x, floorId: y, roomId: z}@getmapping("/FunctionName") public Flux<SectionDTO> getRoomSections(@RequestBody BuildingRequestBean buildingRequestBean) {您可以这样使用,而无需将其添加到路径中。 - Berke Şahin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接