Request method 'GET' not supported Spring MVC

53,302

Solution 1

I'm going to start an answer and add to it as details become available. For your current error

org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'selected' is not present

This happens because when you have something like

@RequestParam String selected,

And @RequestParam doesn't have a value attribute set, Spring will use the name of the parameter to look for the request parameter to bind. In your form, you obviously don't have a parameter named selected. What you want is to get the value in

<select id="cJobs" name="cJobs" >

So change your @RequestParam to

@RequestParam(value = "cJobs") String selected

to match the name attribute of the select input element.

Solution 2

Replace

@RequestMapping(value = MAIN_VIEW, method = RequestMethod.POST)

with

@RequestMapping(value = MAIN_VIEW, method = RequestMethod.GET)

You should also consider changing the form POST method. Your use case is more of Get rather than POST

Share:
53,302
Admin
Author by

Admin

Updated on February 06, 2020

Comments

  • Admin
    Admin about 4 years

    I have the following code in the controller

      private static final String CJOB_MODEL    = "cJobNms";
    
      @RequestMapping(value = MAIN_VIEW, method = RequestMethod.POST)
      public String showTestXsd(//@ModelAttribute(FORM_MODEL) TestXsdForm xsdForm,
                //@ModelAttribute(MODEL) @Valid
                //TestXsdTable testXsdTable,
                @RequestParam String selected,
                Model model) throws DataException {
    
            String cJobNm =null;
            List<String> cJobNmList = null;
            System.out.println("selected:"+ selected);
            String xsdView = testXsdService.getXsdString();
            cJobNmList = testXsdService.getCJobNm();
            Set<String> cJobNmSet = new HashSet<String>(cJobNmList);
            TestXsdForm xsdForm = new TestXsdForm();
            model.addAttribute("xsdView", xsdView);
            model.addAttribute("xsdFormModel", xsdForm);
            model.addAttribute(CJOB_MODEL, cJobNmSet);
            xsdForm.setXsdString(xsdView);
    
            return MAIN_VIEW;
        }
    

    And the following code in my jsp.

    <form:form modelAttribute="testXsdTable" name="xsdForm" action="/xsdtest/testXsdTables"
                            id="xsdForm" method="POST" class="form"
                                                enctype="multipart/form-data" >
    
    
                <tr>
                 <td>
                  <label for="cJobs" class="fieldlabel">Jobs:</label>
                   <select id="cJobs" name="cJobs" >
                    <option value="${selected}" selected>${selected}</option>
                    <c:forEach items="${cJobNms}" var="table">
                        <c:if test="${table != selected}">
                                <option value="${table}">${table}</option>
                            </c:if>
                     </c:forEach>
                   </select>
                </td>
                </tr>
                <pre>
                   <c:out value="${xsdForm.xsdString}"/>
                </pre>
    <div class="confirmbuttons">
        <a href="#"class="button positive" id="saveXsdButton" onclick="saveTestXsd();">
            <span class="confirm">Save</span>
        </a>
    </div>
    

    When the user selects an option from the cJobNms list the selected value should be displayed in the controller method showTestXsd. Please let me know what I am doing wrong.

    Currently I am getting a message : Request method 'GET' not supported

     @RequestMapping(value = SAVE_VIEW, method = RequestMethod.POST)
    public String saveTestXsd( @ModelAttribute(MODEL) @Valid
                                TestXsdTable testXsdTable,
                                final BindingResult result,
                                final Principal principal,
                                Model model) throws DataException {
    
        boolean isNew = true;
        System.out.println("entering saveTestXsd in controller");
        Map<String,Object> modelMap = model.asMap();
        String xsdView = (String)modelMap.get("xsdView");
        System.out.println("xsdView:::"+ xsdView);
        if(testXsdTable!= null){
             System.out.println("xsdView(testXsdForm):::"+ testXsdTable.getXsdView());
        }
    
    
        // Check for validation errors
        if (result.hasErrors()) {
            return SAVE_VIEW;
        }
    
        // Get the user information
        User loggedInUser = (User) ((Authentication) principal)
                            .getPrincipal();
    
        return SAVE_VIEW;
    }