Разве невозможно иметь @RequestParam в виде списка? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть такой контроллер:

@RequestMapping(value="/selectTimeSpaceBusRunList.do")
public ModelAndView selectTimeSpaceBusRunList(Model model, HttpServletRequest request,
        @RequestParam("search_date") String search_date,
        @RequestParam(value="compid", required=false, defaultValue="") String compid,
        @RequestParam(value="routeid", required=true) String routeid,
        @RequestParam(value="busList", required=true) List<String> busList)
{
    ModelAndView mv = new ModelAndView();
    Map<String, List<TbDmhTmspaceChartVO>> resultMap = new HashMap<String, List<TbDmhTmspaceChartVO>>();

    try {
        TbDmhTmspaceChartVO vo = new TbDmhTmspaceChartVO();
        search_date = search_date.replaceAll("-", "");
        vo.setSearch_start_date(search_date + "000000");
        vo.setSearch_end_date(search_date + "235959");
        vo.setCompid(compid);
        vo.setRouteid(routeid);
        vo.setBusList(busList);
        List<TbDmhTmspaceChartVO> resultList = runService.selectTimeSpaceBusRunList(vo);
        resultMap.put("resultList", resultList);
    } catch (Exception e) {
        logger.error("##selectTimeSpaceBusRunList exception " + e.toString());
    }
    mv.addAllObjects(resultMap);
    mv.setViewName("jsonView");
    return mv;
}

И у меня такой VO:

public class TbDmhTmspaceChartVO {
private String run_enddt;       //  date                yes     1   
private String busid;           //  number(9,0)         yes     2   
private String run_startdt;     //  date                yes     3   
private String routeid;         //  number(9,0)         yes     4   
private String compid;          //  number(6,0)         yes     5   
private String carregno;        //  varchar2(12 byte)   yes     6   
private String runord;          //  number(4,0)         yes     7   
private String start_pathseq;   //  number(5,0)         yes     8   
private String end_pathseq;     //  number(5,0)         yes     9   
private String total_bstopcnt;  //  number(10,0)        yes     10  
private String seq_list;        //  varchar2(4000 byte) yes     11  
private String node_list;       //  varchar2(4000 byte) yes     12  
private String hms_list;        //  varchar2(4000 byte) yes     13  
private String coll_list;       //  varchar2(4000 byte) yes     14  
private String cross_pass_cnt;  //  number(10,0)        yes     15  
private String seq_list_1;      //  varchar2(4000 byte) yes     16  
private String node_list_1;     //  varchar2(4000 byte) yes     17  
private String hms_list_1;      //  varchar2(4000 byte) yes     18  
private String coll_list_1;     //  varchar2(4000 byte) yes     19  
private String bstop_dep_cnt;   //  number(10,0)        yes     20  
private String seq_list_3;      //  varchar2(4000 byte) yes     21  
private String node_list_3;     //  varchar2(4000 byte) yes     22  
private String hms_list_3;      //  varchar2(4000 byte) yes     23  
private String coll_list_3;     //  varchar2(4000 byte) yes     24  

private String search_start_date;
private String search_end_date;

private List<String> busList;

// getters and setters...
public List<String> getBusList() {
    return busList;
}
public void setBusList(List<String> busList) {
    this.busList = busList;
}
}

Для данных, которые я отправляю:

busList: ["7211342", "7015067"]
compid: "166001"
routeid: "165000056"
search_date: "2017-11-06"

Мой вызов ajax выглядит так:

$.ajax({
    type: "POST",
    url: "./run/selectTimeSpaceBusRunList.do",
    data: {
        search_date : input_date,
        compid : $("#busCompany").val(),
        routeid : $("#busRoute").val(),
        busList : selected_bus_list
    },
    dataType : "json",
    beforeSend: null,
    success: success,
    error: null
});

Когда вызов ajax завершен, он заканчивается ошибкой, подобной этой:

org.springframework.web.bind.MissingServletRequestParameterException: Required List parameter 'busList' is not present

Так что должна быть проблема с @RequestParam(value="busList", required=true) List<String> busList), но я не смог найти решение с его помощью.

Мой вопрос:

  1. Нельзя ли получить List переменную с @RequestParam?
  2. Если это невозможно, есть ли другой способ получить List переменную?
  3. Можно ли получить переменную DTO сразу?

С уважением,


ОБНОВЛЕНИЕ

Я изменил @RequestParam(value="busList", required=true) List<String> busList) на @RequestParam(value="busList", required=false) List<String> busList), и теперь он работает нормально.Поэтому я думаю, что проблема заключается в том, что busList не отправлено правильно.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Когда вы передаете строковые значения.Вы можете использовать массив busList, например

http://localhost:8080/selectTimeSpaceBusRunList?busList=1,2,3&search_date=20120101&compid=123&routeid=someId

Таким образом, конечная точка контроллера будет выглядеть так:

@RequestMapping(value = "/selectTimeSpaceBusRunList") 
public void selectTimeSpaceBusRunList(@RequestParam("busList") String[] busList, @RequestParam("search_date") String search_date, @RequestParam("compid") String compid, @RequestParam("routeid") String routeid) {
   //Business logic here.
 }
0 голосов
/ 25 февраля 2019

Вы можете сделать это следующим образом.

http://127.0.0.1:8080/test?busList=A1,A2

 @PostMapping("/test")
 public void test(@RequestParam("busList") List<String> busList) {    
      System.out.println(busList); //[A1,A2]
 }
0 голосов
/ 25 февраля 2019

Наиболее распространенный и стандартный способ передачи списка значений в качестве параметров URL - это повторение их, т. Е.

http://rentacar.com/api/v1/search?make=audi&model=A8&type=6&type=11&type=12&color=RED&color=GREY

Теперь вопрос заключается в обработке такого ввода в Spring MVC REST.конечная точка?Предположим, вы разрабатываете API для поиска, чтобы найти автомобили, доступные для аренды;Вот как вы это сделаете:

public List<Vehicle> search(@RequestParam(value="make", required=false) String make, @RequestParam(value="model", required=false) String model, @RequestParam(value="type", required=false) List<String> types, @RequestParam(value="color", required=false) List<String> colors) {
....
}

https://medium.com/@rasheedamir/spring-mvc-how-to-pass-list-of-values-as-url-parameters-5d57dcac8457

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...