2011-04-02 5 views
5

J'ai eu un problème avec la capture de la requête PUT envoyée au serveur.Spring Framework, activer la méthode PUT

Ce sont mes méthodes:

@RequestMapping(method= RequestMethod.GET) 
public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
    System.out.println("get request"); 
    return "index"; 
} 


@RequestMapping(method= RequestMethod.PUT) 
public String putCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
    System.out.println("put request"); 
    return "index"; 
} 

Quand je traçais l'appel, ma demande de PUT a été traitée par la méthode GET et non par la méthode PUT dans ma classe .. sur hors écran, il Toujours lu comme « get demande". J'ai vérifié le journal du navigateur et confirme qu'ils ont envoyé la demande PUT correcte, donc je pense que j'ai manqué une configuration de ressort ici, mais je ne sais pas ce que c'est ..

Quelqu'un peut-il aider s'il vous plaît?

Merci.

EDIT: Code supplémentaire avec classe:

@Controller 
@RequestMapping(value="/retail/{cid}/master/city") 
public class City { 

    @RequestMapping(value="/foo1", method= RequestMethod.GET) 
    public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
     System.out.println("get request"); 
     return "index"; 
    } 

    @RequestMapping(value="/foo2", method= RequestMethod.PUT) 
    public String putCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
     System.out.println("put request"); 
     return "index"; 
    } 
} 

EDIT2: Désolé, il semble que je ne l'ai pas très complet lors de l'examen du journal .. Je pris cet avertissement à deux reprises.

WARNING: Error in annotation processing: java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

des idées comment résoudre ce problème?

+0

Si 'getCity' est invoqué, la requête est une méthode' GET'. Aucune configuration supplémentaire n'est requise, vous devez envoyer le mauvais type de demande. Êtes-vous sûr que votre client fait la bonne chose? – skaffman

+0

oui .. Je suis sûr que le client faisait la bonne chose. Il était connecté à la console. Essayé avec chrome et firefox, et les deux ont envoyé la demande PUT. – Magician

+0

Ajoutez un paramètre 'HttpServletRequest' à' getCity', puis connectez 'request.getMethod()' et voyez ce que cela signifie. – skaffman

Répondre

3

Il est résolu ... C'est la méthode révisée qui fonctionne

 
@Controller 
@RequestMapping(value="/retail/{cid}/master/city") 
public class City { 

    @RequestMapping(method= RequestMethod.GET) 
    public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
    System.out.println("get request"); 
    return "index"; 
    } 

    @RequestMapping(method= RequestMethod.PUT) 
    public String putCity(@PathVariable(value="cid") String cid, @RequestBody CityData state, Model model) { 
    System.out.println(state.getState()); 
    return "index"; 
    } 
} 
 
public class CityData { 
    private String state; 
    public String getState() { 
    return this.state; 
    } 
    public void setState(String state) { 
    this.state = state; 
    } 
} 

Vous pouvez utiliser @RequestBody String state, mais je préfère créer un objet CityData parce que l'échantillon est au-dessus de mon code simplisme, seulement pour vérifier comment gérer les données

1

Cela peut avoir quelque chose à voir avec le fait que vous n'avez pas spécifié de valeur de mappage. Essayez @RequestMapping(value="/foo", ...GET) et @RequestMapping(value="/foo", ...PUT) respectivement

La documentation écrit:

Si vous avez une seule méthode par défaut (sans mappage de chemin d'accès explicite), toutes les demandes sans une méthode cartographié plus spécifique trouvée seront envoyés à elle. Si vous avez plusieurs méthodes par défaut, le nom de la méthode sera pris en compte pour choisir entre elles.

A propos de l'erreur - vous devez ajouter le fichier aopalliance à votre classpath.

+0

J'ai défini le mappage uniquement au niveau de la classe. La méthode va gérer les demandes. – Magician

+0

@Rudy Dajoh bien, essayez cela - cela pourrait être un problème avec le choix de la méthode à invoquer. – Bozho

+0

Ok, je l'ai testé en utilisant '@ RequestParam', celui qui était appelé était getCity, alors que la suppression de tous les paramètres invoquerait correctement putCity sans paramètre. Je ne peux pas capturer les paramètres en utilisant cependant HttpServletRequest. Je viens de voir une erreur 'request_ invalide en utilisant' @ RequestParam' qui peut être une raison pour laquelle putCity a échoué et a appelé getCity à la place, et peut-être le problème principal est que Java ne peut récupérer aucun paramètre de la requête. J'ai essayé avec RoR de capturer les données, et RoR a pu recevoir toutes ses données de forme correctement. Donc, je suis sûr que le problème réside dans Java. – Magician