I am populating multiple rows from the database (each representing OurParameter) into my form. The form class has a list of the OurParameters. I am able to populate the form as below: populated form
However when submit, I am getting a null pointer excepption: For some reason the modelAttribute is not returned back to the controller post method (i.e. save)
java.lang.NullPointerException at uk.ac.ucl.isd.our.web.controller.SettingsFormController.save(SettingsFormController.java:71) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) at javax.servlet.http.HttpServlet.service(HttpServlet.java:643) at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) Any idea why?
I am using springframework v2.5.6... I have tried implementing (How to Insert multiple rows from web form into database using java spring framework) but it did not work for me.
The form class:
package uk.ac.ucl.isd.our.web.controller.command;
import java.util.List;
import uk.ac.ucl.isd.our.access.domain.OurParameter;
public class SettingsForm {
private List<OurParameter> params;
public List<OurParameter> getParams() {
return params;
}
public void setParams(List<OurParameter> params) {
this.params = params;
}
}
The OurParameter class:
package uk.ac.ucl.isd.our.access.domain;
import uk.ac.ucl.upi.AppParameter;
public class OurParameter {
private String app;
private String description;
private String enabled;
private String grp;
private String name;
private String value;
private String paramValue;
private String paramType;
private String paramFormat;
public String getApp() {
return app;
}
public void setApp(String app) {
this.app = app;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getEnabled() {
return enabled;
}
public void setEnabled(String enabled) {
this.enabled = enabled;
}
public String getGrp() {
return grp;
}
public void setGrp(String grp) {
this.grp = grp;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getParamValue() {
return paramValue;
}
public void setParamValue(String paramValue) {
try {
this.paramValue = AppParameter.getValue(getValue());
} catch (Exception e) {}
}
public String getParamType() {
return paramType;
}
public void setParamType(String paramType) {
try {
this.paramType = AppParameter.getType(getValue());
} catch (Exception e) {}
}
public String getParamFormat() {
return paramFormat;
}
public void setParamFormat(String paramFormat) {
try {
this.paramFormat = AppParameter.getFormat(getValue());
} catch (Exception e) {}
}
}
The Controller:
package uk.ac.ucl.isd.our.web.controller;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import uk.ac.ucl.isd.our.access.domain.OurParameter;
import uk.ac.ucl.isd.our.service.UPIService;
import uk.ac.ucl.isd.our.web.controller.command.SettingsForm;
/**
*
*
* @author Mo
*
*
*/
@Controller
public class SettingsFormController {
final static Logger logger = Logger.getLogger(SettingsFormController.class);
private UPIService upiService;
@Autowired
public void setUpiService(UPIService upiService)
{
this.upiService = upiService;
}
public SettingsFormController()
{
}
@RequestMapping(value = "/settings.do", method = RequestMethod.GET)
public ModelAndView get() {
SettingsForm settingsForm = new SettingsForm();
List<OurParameter> ourparams = upiService.getAppParamsInfo("OUR");
settingsForm.setParams(ourparams);
return new ModelAndView("settingsForm","settingsForm", settingsForm);
}
@RequestMapping(value = "/settings.do", method = RequestMethod.POST)
public ModelAndView save(@ModelAttribute("settingsForm") SettingsForm settingsForm) {
for (OurParameter oPP: settingsForm.getParams()){
logger.info("Momo Says the posted thingy is: "+oPP.getValue());
logger.info("Momo Says the posted thingy is: "+oPP.getName());
}
//return null;
return new ModelAndView("settingsForm");
}
}
and finally the JSP:
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Spring 3 MVC Multipe Row Submit - viralpatel.net</title>
</head>
<body>
<h2>Spring MVC Multiple Row Form Submit example</h2>
<form:form method="post" modelAttribute="settingsForm">
<table>
<tr>
<th>No.</th>
<th>Name</th>
</tr>
<c:forEach items="${settingsForm.params}" var="setting" varStatus="pStatus">
<tr>
<td align="center">${status.count}</td>
<td>
<input name="settingsForm.params[${status.index}].app" value="${setting.app}"/>
<input name="settingsForm.params[${status.index}].description" value="${setting.description}"/>
<input name="settingsForm.params[${status.index}].enabled" value="${setting.enabled}"/>
<input name="settingsForm.params[${status.index}].grp" value="${setting.grp}"/>
<input name="settingsForm.params[${status.index}].value" value="${setting.value}"/>
<input name="settingsForm.params[${status.index}].paramValue" value="${setting.paramValue}"/>
<input name="settingsForm.params[${status.index}].paramType" value="${setting.paramType}"/>
<input name="settingsForm.params[${status.index}].paramFormat" value="${setting.paramFormat}"/>
</tr>
</c:forEach>
</table>
<br/>
<input type="submit" value="Save" />
</form:form>
</body>
</html>