3
votes

Est-il impossible d'avoir un @RequestParam comme liste?

J'ai un contrôleur comme celui-ci:

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

Et j'ai VO comme celui-ci:

$.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
});

Pour les données que j'envoie est :

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

Mon appel ajax est comme ceci:

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

Lorsque l'appel ajax est terminé, il se termine par une erreur comme ceci:

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

Il doit donc y avoir un problème avec @RequestParam (value = "busList", required = true) List busList) , mais je n'ai pas pu trouver la solution avec.

Ma question est:

  1. Est-il impossible d'obtenir la variable List avec @RequestParam ?
  2. Si c'est impossible, existe-t-il un autre moyen d'obtenir la variable List ?
  3. Est-il possible d'obtenir la variable DTO à la fois?

Regards,


J'ai changé le @RequestParam (value = "busList", obligatoire = true) List busList) dans @RequestParam (value = "busList", required = false) List busList) , et maintenant cela fonctionne très bien. Je pense donc que le problème vient du fait que busList n’est pas envoyé correctement.


7 commentaires

Liste de passe comme: busList = A1 & busList = A2 ou busList = A1, A2, A3 . Vous pouvez également intégrer tous les paramètres de requête dans une seule classe.


@ MạnhQuyếtNguyễn Je suis désolé mais où dois-je mettre ça?


@ MạnhQuyếtNguyễn dit simplement que du point de vue de la requête, votre appel AJAX devrait "formater" la requête comme il le suggère. En d'autres termes, il dit que c'est possible, maintenant vous devez faire passer votre frontal dans la liste de la bonne manière.


pouvez-vous s'il vous plaît vérifier setter pour busList


@ArunKumar J'ai posté des getters et des setters ci-dessus.


pourquoi utiliser public void setBusList (String [] busList) {this.busList = busList; } au lieu de public void setBusList (List busList) {this.busList = busList; }


@ArunKumar Oh, j'ai changé le type de busList de List en String en essayant de gérer le problème. C'était List quand j'ai posté.


3 Réponses :


2
votes

Le moyen le plus courant et standard de transmettre une liste de valeurs en tant que paramètres d'URL est de les répéter, c'est-à-dire

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

Maintenant, la question est de gérer une telle entrée dans le point de terminaison Spring MVC REST? Supposons que vous développiez une API de recherche pour trouver des voitures disponibles à la location; voici comment procéder:

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 -paramètres-5d57dcac8457


9 commentaires

J'ai fait comme le code que vous avez écrit, mais maintenant il est livré avec l'erreur org.springframework.web.bind.MissingServletRequestParameterE‌ xception: Le paramètre de liste requis 'busList' n'est pas présent .


Êtes-vous sûr que l'URL que vous utilisez pour nous appeler est correcte?


Oui, je suis sûr que l'URL est correcte. J'ai le sentiment que c'est peut-être à cause des données que j'envoie. J'essaie d'envoyer un tableau en Javascript et il est peut-être erroné de l'obtenir en tant que liste dans le contrôleur.


Avez-vous utilisé un débogueur ou un enregistreur pour vérifier réellement l'URL assemblée dans votre Javascript?


Oui, j'ai vérifié l'enregistreur lorsque j'écrivais cette question.


L'envoyez-vous en tant que busList = 1 & busList = 2 ou busList = [1,2] ?


J'envoie busList = [1, 2]


Cela devrait être comme ceci busList = 1 & busList = 2 ou busList = 1,2 sans crochets.


C'était ça! Je vous remercie:)



0
votes

Lorsque vous passez des valeurs de chaîne. Vous pouvez utiliser un tableau de busList comme

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

Ainsi, le point de terminaison du contrôleur sera comme,

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


2 commentaires

method = RequestMethod.GET doit-il exister?


pas nécessaire, par défaut la méthode est GET donc pas nécessaire.



0
votes

Vous pouvez le faire comme ceci.

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]
 }


2 commentaires

Existe-t-il une autre solution à côté de cela? J'essaye de travailler comme mon appel ajax ci-dessus.


puis utilisez @RequestBody pour la liste des bus