データベースにレコードを保存する関数を持つ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)
_@PathVariable
_は、URIパスの一部がメソッドに渡す値であることをSpringに伝えるために使用されます。これはあなたが望むものですか、または変数はURIに投稿されたフォームデータであるはずですか?
フォームデータが必要な場合は、_@RequestParam
_ではなく_@PathVariable
_を使用します。
_@PathVariable
_が必要な場合は、_@RequestMapping
_エントリにプレースホルダーを指定して、パス変数がURIに収まる場所をSpringに通知する必要があります。たとえば、contentId
というパス変数を抽出する場合は、次を使用します。
@RequestMapping(value = "/whatever/{contentId}", method = RequestMethod.POST)
編集:さらに、パス変数に「。」を含めることができる場合データのその部分が必要な場合は、「。」の前のものだけでなく、すべてを取得するようにSpringに指示する必要があります。
@RequestMapping(value = "/whatever/{contentId:.*}", method = RequestMethod.POST)
これは、Springのデフォルトの動作では、URLのその部分をファイル拡張子として扱い、変数抽出から除外するためです。