web-dev-qa-db-fra.com

Variable de modèle URI Spring MVC manquante

J'ai une classe Controller avec une fonction qui enregistre un enregistrement dans la base de données. Je passe plusieurs paramètres à la fonction Controller mais je pense que je peux écrire le @RequestMapping incorrectement. Sous le code

Contrôleur

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

        } 

     }

demande 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);
    });

Journal des erreurs

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)
17
devdar

@PathVariable Est utilisé pour indiquer à Spring qu'une partie du chemin URI est une valeur que vous souhaitez transmettre à votre méthode. Est-ce ce que vous voulez, ou les variables sont-elles censées être des données de formulaire publiées sur l'URI?

Si vous voulez des données de formulaire, utilisez @RequestParam Au lieu de @PathVariable.

Si vous voulez @PathVariable, Vous devez spécifier des espaces réservés dans l'entrée @RequestMapping Pour indiquer à Spring où les variables de chemin tiennent dans l'URI. Par exemple, si vous souhaitez extraire une variable de chemin d'accès appelée contentId, vous utiliserez:

@RequestMapping(value = "/whatever/{contentId}", method = RequestMethod.POST)

Edit: De plus, si votre variable de chemin peut contenir un '.' et vous voulez cette partie des données, alors vous devrez dire à Spring de tout récupérer, pas seulement les choses avant le '.':

@RequestMapping(value = "/whatever/{contentId:.*}", method = RequestMethod.POST)

En effet, le comportement par défaut de Spring consiste à traiter cette partie de l'URL comme s'il s'agissait d'une extension de fichier et à l'exclure de l'extraction de variables.

55
Jason