使用SpringMVC和REST提交表单时出错

时间:2009-10-15 20:30:18

标签: spring jsp rest spring-mvc resteasy

使用SpringMVC标记库在JSP中创建在线表单。我的表单的控制器是一个RESTful Web服务。

RESTful Web服务有两个调用:

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

这会在浏览器中显示在线表单(这有效)。

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

这将表单数据保存到数据库(处理提交)。这就是它破裂的地方。

遵循Spring Framework附带的示例演示petclinic应用程序中的约定。

在线表格:

<%@ 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>

用作表单控制器的RESTful Web服务:

@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;
   }
}

点击提交时抛出异常:

执行POST / applications / create失败 org.jboss.resteasy.spi.BadRequestException:

无法找到类型为

的邮件正文阅读器

接口org.springframework.ui.Model的内容类型: application / x-www-form-urlencoded at

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

有谁知道为什么我会收到这个例外?

如果有人可以帮我解决这个问题,我真的很感激......

编程愉快,感谢您花时间阅读本文。

2 个答案:

答案 0 :(得分:3)

这是一个RESTEasy问题......解决方法是将@Form Application App放在参数列表中,并在域模型对象的setter中加上@FormParam(“name”)。

请参阅:Integrating RESTEasy with SpringMVC

答案 1 :(得分:0)

您还没有告诉您的控制器它接受哪些mime类型以及如何映射它们,它需要一个与该mime类型相关联的Reader来映射它并将其发送到您的方法中。