Question

Created an online form in JSP using SpringMVC tag libraries. The controller for my form is a RESTful web service.

The RESTful web service has two calls:

(1) http://localhost:8080/myapp/applications/new

This brings up the online form in the browser (this works).

(2) http://localhost:8080/myapp/applications/create

This saves the form data to a database (handles submit). This is where it breaks.

Followed the conventions from the sample demo petclinic app which comes with the Spring Framework.

Online form:

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
     <body>
       <form:form modelAttribute="application" method="POST" action="create">
      <table>
        <tr>
          <td>Name:</td>
          <td><form:input path="name" size="30" maxlength="80"/></td>
        </tr>
        <tr>
          <td>Description:</td>
          <td><form:input path="description" size="30" maxlength="80"/></td>
        </tr>
        <tr>
          <td>Image URL:</td>
          <td><form:input path="imgUrl" size="30" maxlength="80"/></td>
        </tr>
      </table>
      <input type="submit" value="Save" />
        </form:form>
    </body>
</html>

The RESTful web service which serves as form controller:

@Controller
@Path(ApplicationsResource.APPLICATION_URL)
public class ApplicationsResource
{
    private final Logger log = 
            LoggerFactory.getLogger(ApplicationsResource.class);

    public static final String APPLICATION_URL = "/applications";

    @Autowired
    private ApplicationManager applicationManager;

    @Autowired
    private ProfileManager profileManager;

    @POST
    @Path("create")
    @Produces(MediaType.TEXT_HTML)
    public Model getNewApplication(@Context HttpServletRequest request,
                                   @RequestAttribute Model model)
    {

        Application app = new Application();
        model.addAttribute("application", app);
        try
        {
          if ("POST".equalsIgnoreCase(request.getMethod()))
          {
              if (app != null)
              {
                  applicationManager.save(app);
                  log.info("Added application: " + app.getName());
              }
              else
              {
                  log.info("Application not added");
              }
           }
         } 
         catch (Exception e)
         {
          log.info("Exception: ", e);
          throw new
                  WebApplicationException(Response.status(
                   RestError.SERVER_ERROR_HTTP_RESP).
                   type("application/json;charset=utf-8").
                   entity(new ErrorOutput(RestError.SERVER_ERROR_CODE, RestError.SERVER_ERROR_MSG, e.toString())).build());
          }
      return model;
    }

   @InitBinder
   public void setAllowedFields(WebDataBinder dataBinder)
   {
       dataBinder.setDisallowedFields(new String[] {"id"});
   }

   @GET
   @Path("new")
   @Produces( { MediaType.TEXT_HTML })
   public ModelAndView getNewApplicationForm()
   {
       log.info("ApplicationsResource - Inside getNewApplicationForm");
       ModelAndView mv = new ModelAndView("/applications/applications_new");
       mv.addObject("application", new Application());
       return mv;
   }
}

Exception thrown when I click on submit:

Failed executing POST /applications/create org.jboss.resteasy.spi.BadRequestException:

Could not find message body reader for type:

interface org.springframework.ui.Model of content type: application/x-www-form-urlencoded at

org.jboss.resteasy.core.MessageBodyParameterInjector$1 createReaderNotFound(MessageBodyParameterInjector.java:73)

Does anyone know why I am getting this exception?

Would really appreciate it if someone could help me with this issue...

Happy programming and thank you for taking the time to read this.

Was it helpful?

Solution

It was a RESTEasy problem... The fix was putting the @Form Application App inside the parameter list and prepending the domain model object's setters with @FormParam("name").

See: Integrating RESTEasy with SpringMVC

OTHER TIPS

You haven't told your controller what mime types it accepts and how to map them, it needs a Reader associated with that mime type to map it and send it into your method.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top