【问题标题】:Spring Bind @PathVariable to JavaBeanSpring将@PathVariable绑定到JavaBean
【发布时间】:2020-07-18 11:56:52
【问题描述】:

我尝试在 Spring 控制器中绑定一个对象,以便它可以用作@PathVariable。我想这样做,因为我想传递一些@PathVariable。我已经尝试过Bind Path variables to a custom model object in springIs it possible to bind path variable and request param into a single object? 的解决方案。但两者都不起作用。

我在我的控制器中创建了类似的东西。

@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;
}

当我检查BuildingRequestBean 时,当我用GET localhost:8080/buildings/a/floors/b/rooms/c/sections 调用它时,属性为空。 但是,如果我将其称为@RequestParam,它不会为空,类似于GET localhost:8080/buildings/{buildingId}/floors/{floorId}/rooms/{roomId}/sections?buildingId=a&amp;floorId=b&amp;roomId=c

如何修复它,使其表现得像 @PathVariable 而不是像 @RequestParam

【问题讨论】:

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

标签: java spring-boot spring-mvc


【解决方案1】:

必须在函数参数中添加PathVariable

试试这个:

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

【讨论】:

  • 如果@PathVariable太多会导致控制器乱码。我希望@PathVariable 可以包裹在一个对象中。
  • with json request {buildingId: x, floorId: y, roomId: z} @getmapping ( "/FunctionName") public Flux getRoomSections (@RequestBody BuildingRequestBean buildingRequestBean) { 你可以用这个方式而不将其添加到路径中。
【解决方案2】:

你可以通过@ModelAttribute获取它

试试这个:

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

【讨论】:

  • 我尝试添加@ModelAttribute,但它不起作用
  • 你用的是spring-boot还是spring?
  • 我使用的是 spring-boot 2.2,但它不工作。仍然像@RequestParam
  • 如果您将此网址称为localhost:8080/buildings/a/floors/b/rooms/c/sections。映射应该是工作。我在本地测试过
猜你喜欢
  • 2023-03-14
  • 2012-11-27
  • 2013-11-02
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2013-11-17
  • 2012-12-01
相关资源
最近更新 更多