2009-10-15 22 views
2

使用SpringMVC标签库在JSP中创建了一个在线表单。我的表单的控制器是一个RESTful Web服务。使用SpringMVC和REST提交表单时出错

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 /应用/创建 org.jboss.resteasy.spi.BadRequestException:

找不到消息体读取器,用于类型:内容类型的

接口org.springframework.ui.Model:在

有机 应用程序/ x-WWW窗体-urlencoded。 jboss.resteasy.core.MessageBodyParameterInjector $ 1 createReaderNotFound(MessageBodyParameterInjector.java:73)

有谁知道为什么我得到这个例外? N +

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

快乐编程,并感谢您抽出宝贵的时间来阅读。

回答

3

这是一个RESTEasy问题...修正是将@Form应用程序应用程序放入参数列表中,并将@FormParam(“name”)添加到域模型对象的设置器中。

参见:Integrating RESTEasy with SpringMVC

0

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

+0

这是一个问题的RESTEasy ...的修复程序。把@Form应用程序应用程序的参数列表中,并与@FormParam(“名称”)前面加上域模型对象的setter方法。 – 2009-10-17 21:20:18