0

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>

1 Answers1

0

In the example you referenced, wouldn't you use:

<form:input path="settingsForm.params[${status.index}].paramValue"/>

Shoudn't you try this first?

Derrops
  • 7,651
  • 5
  • 30
  • 60
  • Thanks snickers3192 but I already did and it gave me this error: org.apache.jasper.JasperException: /WEB-INF/jsp/settingsForm.jsp(21,3) Attribute value invalid for tag input according to TLD – Mohamed Ahmed Oct 28 '16 at 09:01