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
, mais je n'ai pas pu trouver la solution avec.
Ma question est:
List
avec @RequestParam
? List
? Regards,
J'ai changé le @RequestParam (value = "busList", obligatoire = true) List
dans @RequestParam (value = "busList", required = false) List
, et maintenant cela fonctionne très bien. Je pense donc que le problème vient du fait que busList
n’est pas envoyé correctement.
3 Réponses :
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) { .... }
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:)
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
method = RequestMethod.GET
doit-il exister?
pas nécessaire, par défaut la méthode est GET donc pas nécessaire.
Vous pouvez le faire comme ceci.
@PostMapping("/test") public void test(@RequestParam("busList") List<String> busList) { System.out.println(busList); //[A1,A2] }
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
Liste de passe comme:
busList = A1 & busList = A2
oubusList = 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é.