Spring MVC de Statut HTTP 405 - Demande de la méthode "POST" pas pris en charge colonne vertébrale de la Demande
Je suis nouveau à Spring MVC et je suis en train de créer une Application Web à partir de zéro à l'aide de Spring MVC + Hibernate pour servir à quelque chose comme un JSON API Rest, avoir cette API consommés à travers l'épine Dorsale du côté client. Pour ce faire, j'ai commencé à suivre ce tutoriel ( http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/ ) .
So I have a model Message which will have the following REST API Interface:
GET /api/messages ( working ok )
GET /api/messages/:id ( working ok )
DELETE /api/messages/:id ( working ok )
PUT /api/messages/:id ( working ok )
POST /api/messages ( error: (DefaultHandlerExceptionResolver.java:194) - Request method 'POST' not supported)
Je m'attendais à ce problème se pose pour METTRE ou SUPPRIMER des demandes en faisant la demande via un formulaire, mais pas pour une requête POST. Je ne suis même pas faire la demande via un formulaire. Du côté client, la demande se fait par le biais de la Dorsale comme ceci:
new App.Models.Message({ attributeA : 'a', attributeB : 'b' }).save();
J'ai déjà essayé d'ajouter l'httpMethodFilter à web.xml comme suggéré dans d'autres Stackoverflow questions:
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<servlet-name>mvc-dispatcher</servlet-name>
</filter-mapping>
Quelqu'un a eu le même problème?
Je laisse ici mon MessagesController:
@Controller
@RequestMapping("/api/messages")
public class MessagesController {
@Autowired
private MessageService messageService;
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody List<Message> getMessagesInJSON(@RequestParam( value = "type", required = false ) String type) {
List<Message> messages = messageService.findAll();
return messages;
}
@RequestMapping( value = "/{id}", method = RequestMethod.GET )
public @ResponseBody Message getMessageInJson(@PathVariable Integer id ) {
Message message = messageService.findById(id);
return message;
}
@RequestMapping( value = "/{id}", method = RequestMethod.DELETE )
@ResponseStatus( value = HttpStatus.NO_CONTENT )
public void deleteMessage(@PathVariable Integer id ) throws NotFoundException {
messageService.delete(id);
}
@RequestMapping( value = "/{id}", method = RequestMethod.PUT )
@ResponseStatus( value = HttpStatus.NO_CONTENT )
public void editMessage( @PathVariable Integer id, @RequestBody Message message ) throws NotFoundException {
message.setId(id);
messageService.update(message);
}
@RequestMapping( value = "/", method = RequestMethod.POST )
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody Message createMessage( @RequestBody Message message ) {
return messageService.create(message);
}
}
Merci beaucoup!
OriginalL'auteur jantunes | 2013-11-13
Vous devez vous connecter pour publier un commentaire.
Vous avez déjà mappé
/api/messages
à lagetMessagesInJSON
méthode qui permet seulement d'une requête GET. Votre demande de publication est la cartographie d'un chemin différent.Je suggère pour omettre la valeur de l'attribut sur votre demande de cartographie pour
createMessage
.Je n'ai pas regardé le code, mais je soupçonne qu'il a à faire avec ce qui demande de la cartographie de la valeur correspond à la demande réelle chemin. Pour éviter cela dans le futur, il est préférable de ne jamais vous en fait la carte "/" mais laissez-le vide.
OriginalL'auteur Bart
Je pense que le problème, c'est que votre
@RequestMapping
est situé dans la partie supérieure de votre définition de la classe, et les conflits avec les chaînes que vous avez associé à lavalue
argument dans l'autre@RequestMapping
annotations en face de chaque méthode. En revanche, je voudrais commencer le cours avec les éléments suivants:Ensuite, vous pouvez utiliser le
value
paramètre dans la@RequestMapping
les annotations que vous avez en face de chaque méthode.OriginalL'auteur CodeMed
Il est également bon de garder à l'esprit que cette erreur peut se produire si vous êtes à la mise en œuvre de
/error
point de terminaison pour la gestion des exceptions. Si votre/error
d'extrémité a un type de méthode, et il ne correspond pas à la méthode de l'extrémité où l'exception a été levée; vous pourriez finir vers le haut d'obtenir 405. Si c'est le cas, retirez-type de méthode de l'erreur de point de terminaison pour servir à tous.OriginalL'auteur amertkara