Reputation: 13585
This seems to be a common issue. I have gone all the answers given in SO but could not make it work.
I am trying to integrate Spring MVC+Freemarker in already existing web application. It works fine for the GET
request and Freemarker Template reads java object provided by Controller without any issue.
But Form submission is not able to hit Controller method. Finally I made log4j work. Here is the error I am getting:
Error
HandlerMethod details:
Controller [application.entry.controller.UserController]
Method [public void application.entry.controller.UserController.handleSave(java.lang.String)]
org.springframework.web.bind.MissingServletRequestParameterException:
Required String parameter 'action' is not present
Freemarker:
<form method="POST" action="save.html">
------------
<input type="submit" class="btnnew" name="saveWithoutValidation" value="Save Without Validation"></input>
<input type="submit" class="btnnew" name="submit" value="Submit"></input>
</form>
context-root is PORTAL.
spring-servlet.xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true"/>
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
web.xml
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Controller
@RequestMapping(value="/save", method=RequestMethod.POST)
public void handleSave(@RequestParam String action){
if( action.equals("submit") ){
System.out.println("Damn! You clicked submit");
}
else if( action.equals("saveWithoutValidation") ){
System.out.println("Sweet! You want no string attached.");
}
}
For logs I have tried to add log4j.logger.org.springframework.web=DEBUG
to my existing log4j.properties but it didn't work.
Upvotes: 9
Views: 110728
Reputation: 907
Add BindingResult parameter in your method. For reference please my code below.
save(@ModelAttribute Employee employee,BindingResult bindingResult)
Upvotes: 0
Reputation: 6111
Please keep your
<form method="POST" action="XYZ">
@RequestMapping(value="/XYZ", method=RequestMethod.POST)
public void handleSave(@RequestParam String action){
Your form action attribute value must match to value of @RequestMapping
, So that Spring MVC can resolve it.
Also, as you told it is giving 404 after changing, for this, can you please check whether control is entering inside handleSave()
method.
I think, as you are not returning any thing from handleSave()
method, you have to look at it.
if it still not work, can you please post your spring logs.
Also, make sure that your request should come like
/PORTAL/save
if there is anything between like PORTAL/jsp/save
the mention in @RequestMapping(value="/jsp/save")
Upvotes: 0
Reputation: 11
@CookieValue(value="abc",required=true) String m
when I changed required from true to false,it worked out.
Upvotes: 0
Reputation: 18961
My problem was the lack of BindingResult
parameter after my model attribute.
@RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded")
public ModelAndView registerUser(@Valid @ModelAttribute UserRegistrationInfo userRegistrationInfo
HttpServletRequest httpRequest,
HttpSession httpSession) { ... }
After I added BindingResult
my controller became
@RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded")
public ModelAndView registerUser(@Valid @ModelAttribute UserRegistrationInfo userRegistrationInfo, BindingResult bindingResult,
HttpServletRequest httpRequest,
HttpSession httpSession) { ..}
Check answer @sashok_bg @sashko_bg Mersi mnogo
Upvotes: 1
Reputation: 3199
I also had this issue and my solution was different, so adding here for any who have similar problem.
My controller had:
@RequestMapping(value = "/setPassword", method = RequestMethod.POST)
public String setPassword(Model model, @RequestParameter SetPassword setPassword) {
...
}
The issue was that this should be @ModelAttribute
for the object, not @RequestParameter
. The error message for this is the same as you describe in your question.
@RequestMapping(value = "/setPassword", method = RequestMethod.POST)
public String setPassword(Model model, @ModelAttribute SetPassword setPassword) {
...
}
Upvotes: 12
Reputation: 2971
Another possible cause is to have the wrong order of RequestMapping attributes. As spring doc says:
An @RequestMapping handler method can have a very flexible signatures. The supported method arguments and return values are described in the following section. Most arguments can be used in arbitrary order with the only exception of BindingResult arguments. This is described in the next section.
If you scroll down the doc, you will see that the BindingResult has to be immediatelly after the model attribute, since we can have multiple model objects per request and thus multiple bindings
The Errors or BindingResult parameters have to follow the model object that is being bound immediately as the method signature might have more than one model object and Spring will create a separate BindingResult instance for each of them so the following sample won’t work:
Here are two examples:
Invalid ordering of BindingResult and @ModelAttribute.
@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, Model model, BindingResult result) { ... } Note, that there is a Model parameter in between Pet and BindingResult. To get this working you have to reorder the parameters as follows:
@RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, Model model) { ... }
Upvotes: 9
Reputation: 41
I was facing a similar issue and found that a few fields like Date were not getting a concrete value, once given the values things worked fine. Please make sure you do not have date or any other field present on the form which needs a concrete value.
Upvotes: 3
Reputation: 30
Controller trying to find the "action" value in bean but according to your example you have not set any bean name of "action". try to do name="action". @RequestParam always find in the bean class.
Upvotes: 1
Reputation: 17361
The @RequestParam String action
suggests there is a parameter present within the request with the name action which is absent in your form. You must either:
<input name="action" />
false
within the @RequestParam
e.g. @RequestParam(required=false)
Upvotes: 12
Reputation: 9791
Based on the error:
Required String parameter 'action' is not present
There needs to be a request parameter named action
present in the request for Spring to map the request to your handler handleSave
.
The HTML that you pasted shows no such parameter.
Upvotes: 1
Reputation: 49915
Your request mapping is /save
, but your POST is to /save.html
. Changing the POST to /save
should fix it.
Upvotes: 0