我有一个Controller类,它具有将数据保存到数据库的功能.我将几个参数传递给Controller函数,但我认为我可能会错误地写入@RequestMapping.下面是代码
调节器
@RequestMapping(value="createRoadBlock.htm",method = RequestMethod.POST) public @ResponseBody Integer createRoadBlock(@RequestParam String purpose,@RequestParam String userName,@RequestParam int status,@RequestParam double latAdd,@RequestParam double longAdd,HttpServletRequest request,HttpServletResponse response) { int roadBlockId = 0; try{ roadBlockId = roadBlockManager.saveRoadBlock(purpose,userName,status,latAdd,longAdd); logger.info("Create Road Block Successful roadBlockId "+ roadBlockId); return roadBlockId; }catch(Exception e){ logger.error("Exception Occured In Road Block Controller "+e.getMessage()); return roadBlockId; } }
Ajax请求
$.ajax({ type:'POST',url:'createRoadBlock.htm',contentType:"application/json",async:false,cache:false,data:{purpose:f_purpose,userName:f_userName,status: f_status,latAdd: f_latAdd,longAdd:f_lngAdd},dataType:'json' }).success(function(recordId){ console.log('Road Block created with id ' + recordId); });
错误日志
Controller [com.crimetrack.web.RoadBlockController] Method [public java.lang.Integer com.crimetrack.web.RoadBlockController.createRoadBlock(java.lang.String,java.lang.String,int,double,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)] org.springframework.web.bind.MissingServletRequestParameterException: required String parameter 'purpose' is not present at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:201) at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:90) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
解决方法
@PathVariable用于告诉Spring这个URI路径的一部分是你想传递给你的方法的一个值.这是你想要的,还是变量应该是形式数据发布到URI?
如果需要表单数据,请使用@RequestParam而不是@PathVariable.
如果您想要@PathVariable,则需要在@RequestMapping条目中指定占位符,以将Spring中的路径变量适用于URI.例如,如果要提取名为contentId的路径变量,则可以使用:
@RequestMapping(value =“/ whatever / {contentId}”,method = RequestMethod.POST)
编辑:另外,如果您的路径变量可能包含’.’而你想要的那部分数据,那么你需要告诉Spring来抓住所有的东西,而不只是在之前的东西.
@RequestMapping(value =“/whatever/{contentId:.*}”,method = RequestMethod.POST)