Spring MVC 缺少 URI 模板变量
Posted
技术标签:
【中文标题】Spring MVC 缺少 URI 模板变量【英文标题】:Spring MVC Missing URI template variable 【发布时间】:2013-11-17 03:51:45 【问题描述】:我有一个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,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)
【问题讨论】:
【参考方案1】:当您在 REST 定义中定义的映射变量与 @PathVariable 名称不匹配时,可能会发生此错误。
示例: 假设你在 REST 定义中定义了
@GetMapping(value = "/appId", produces = "application/json", consumes = "application/json")
那么在定义函数的时候,应该是
public ResponseEntity<List> getData(@PathVariable String appId)
当您将 REST 控制器定义中定义的任何其他变量与 @PathVariable 一起使用时,可能会发生此错误。 就像,下面的代码将引发错误,因为 ID 与 appId 变量名不同:
public ResponseEntity<List> getData(@PathVariable String ID)
【讨论】:
【参考方案2】:我犯了一个愚蠢的错误,@PathVariable 中的变量名与@RequestMapping 中的不匹配
例如
@RequestMapping(value = "/whatever/**contentId**", method = RequestMethod.POST)
public … method(@PathVariable Integer **contentID**)
它可以帮助别人
【讨论】:
上帝...这对我有帮助。我有 @PostMapping(value = "/folders/foldername") 方法[...](@PathVariable String folderName) 大写的“N”是诀窍【参考方案3】:@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)
这是因为 Spring 的默认行为是将 URL 的该部分视为文件扩展名,并将其从变量提取中排除。
【讨论】:
您可以控制 ajax 请求的内容吗?如果是这样,那么在 URI 中使用带有查询参数的 RequestParam 会容易得多。就个人而言,@PathVariable 给我带来了数小时的痛苦,我一次只将它用于一个变量。 您可以使用以下参数构建一个 URI:/createRoadBlock.htm? purpose=abc&userName=def&status=1&latAdd=-33.8675&longAdd=151.2070 或者您可以将值作为数据发布。 RequestParam 不需要您在 RequestMapping 中指定任何特殊的占位符 - 您现有的占位符就可以了。 您的 ajax 是否发布到如下内容:/createRoadBlock.htm? purpose=abc&userName=def&status=1&latAdd=-33.8675&longAdd=151.2070 不要将 json 指定为内容类型。如果这是您的控制器返回的数据类型,则仅将其指定为数据类型。以上是关于Spring MVC 缺少 URI 模板变量的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC + Thymeleaf:将变量添加到所有模板的上下文中