能否将路径变量和请求参数绑定到一个对象中?

7

我正在创建一个带有路径变量和请求参数的端点。如何将路径变量和请求参数组合成单个对象?我正在使用Java 8的springboot 2。

@RequestMapping(path = "/schedules")
public class SchedulesController {

    @GetMapping("/{area}/{subarea}")
    public MyObject getFlight(@PathVariable("area") String area, @PathVariable("subarea") String subarea,
                           MyModel model) {

        ...
        return new MyObject();
    }
}

@Data
public class MyModel {
    LocalDate datestamp,
    String leadName,
    String viceLeadName
}

我看了spring文档,但好像找不到如何将PathVariable合并到MyModel的方法。
以下是我的控制器示例(未包含该对象)。
@RequestMapping(path = "/schedules")
public class SchedulesController {

    @GetMapping("/{area}/{subarea}")
    public MyObject getFlight(@PathVariable("area") String area, @PathVariable("subarea") String subarea,
                            @RequestParam(value = "datestamp", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate datestamp,
                            @RequestParam(value = "leadName", required = false) String leadName,
                            @RequestParam(value = "viceLeadName", required = false) String viceLeadName) {

        ...
        return new MyObject();
    }
}

是否可以实现以下功能?将路径变量和请求参数放在MyModel对象中?
@RequestMapping(path = "/schedules")
public class SchedulesController {

    @GetMapping("/{area}/{subarea}")
    public MyObject getFlight(MyModel model) {

        ...
        return new MyObject();
    }
}

@Data
public class MyModel {
    String area,
    String subArea,
    LocalDate datestamp,
    String leadName,
    String viceLeadName
}

谢谢,但我看过那篇文章了,它只绑定了路径变量。而我想将路径变量和请求参数绑定到一个单一的对象中。 - user293655
是的,这是可能的。 - ArunKumar M N
你能分享一下如何做吗? - user293655
2个回答

9
创建一个名为MyModel的模型。
  class MyModel {
    String area;
    String subarea;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    LocalDate datestamp;
    String leadname;
    String viceleadname;
    @Override
    public String toString() {
        return "MyModel [area=" + area + ", subarea=" + subarea + ", datestamp=" + datestamp + ", leadname=" + leadname
                + ", viceneadname=" + viceleadname + "]";
    }
    public String getArea() {
        return area;
    }
    public void setArea(String area) {
        this.area = area;
    }
    public String getSubarea() {
        return subarea;
    }
    public void setSubarea(String subarea) {
        this.subarea = subarea;
    }
    public LocalDate getDatestamp() {
        return datestamp;
    }
    public void setDatestamp(LocalDate datestamp) {
        this.datestamp = datestamp;
    }
    public String getLeadname() {
        return leadname;
    }
    public void setLeadname(String leadname) {
        this.leadname = leadname;
    }
    public String getViceneadname() {
        return viceleadname;
    }
    public void setViceneadname(String viceleadname) {
        this.viceleadname = viceleadname;
    }

请求映射将与您提到的相同。

  @GetMapping("/{area}/{subarea}")
    public String getFlight(MyModel model) {
      System.out.println(model);

        return "success";
    }

请求如下:

http://localhost:8080/us/ny?datestamp=2019-05-01&leadname=abc&viceleadname=xyz

@user29365,你的请求URL是什么? - ArunKumar M N
http://localhost:8080/us/ny?datestamp=2019-05-01&leadname=abc&viceleadname=xyz 通过Postman发送相同的请求 - Srinivasan Sekar
请求URL:http://localhost:8080/schedules http://localhost:8080/schedules/us/ny?datestamp=2019-05-01&leadname=abc&viceleadname=xyz - user293655
我认为MyModel有些问题。 我正在使用Lombok,当我只使用普通的getter和setter时,你的答案是有效的。也许我需要一些额外的东西来与lombok一起工作? - user293655
已经接受了你的答案。 - user293655
显示剩余3条评论

-1
public class Location {

    private String area;
    private String subarea;

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getSubarea() {
        return subarea;
    }

    public void setSubarea(String subarea) {
        this.subarea = subarea;
    }

}





@Controller
@RequestMapping("schedules")
public class SchedulesController {

    @GetMapping("{area}/{subarea}")

    public String getFlight(Location location ) {
        String msg = String.format("location request. area: %s, subarea: %s",
                location.getArea(), location.getSubarea());


        ..............................

        return new MyObject();

    }
}

像这样做。它会起作用的。


请求参数怎么样? - user293655
http://localhost:8080/schedules/Bangladesh/Dhaka(请注意,这是一个网址链接,无法进行翻译) - Ismail Raju
lombok 1.18.6 也可以工作。 - Ismail Raju

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