Spring MVC HTTP状态405-不支持请求方法"POST"-骨干请求 [英] Spring MVC HTTP Status 405 - Request method 'POST' not supported - Backbone Request

查看:220
本文介绍了Spring MVC HTTP状态405-不支持请求方法"POST"-骨干请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Spring MVC的新手,我正尝试使用Spring MVC + Hibernate从头开始构建Web应用程序,以提供类似于JSON Rest API之类的功能,并通过客户端在Backbone上使用此API.为此,我已经开始按照本教程进行操作( http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/).

I am new at Spring MVC and I am trying to build a Web Application from scratch using Spring MVC + Hibernate to serve something like a JSON Rest API, having this API consumed through Backbone at the client side. To do that I have started following this tutorial ( 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)

我希望通过表单执行请求时,PUT或DELETE请求会发生此问题,而POST请求则不会发生.我什至没有通过表格提出要求.在客户端,请求是通过Backbone完成的,如下所示:

I expected this problem happens for PUT or DELETE requests when doing the request through a form, but not for a POST request. I am not even doing the request through a form. On the client side the request is done through Backbone like this:

new App.Models.Message({ attributeA : 'a', attributeB : 'b' }).save();

我已经尝试按照其他Stackoverflow问题中的建议在web.xml上添加httpMethodFilter:

I have already tried to add the httpMethodFilter at web.xml as suggested in other 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>  

有人遇到过同样的问题吗?

Has anyone had the same problem?

我将MessagesController留在这里:

I leave here my 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);
    }

}

非常感谢!

推荐答案

您已经将/api/messages映射到getMessagesInJSON方法,该方法仅允许GET请求.您的POST请求正在映射到其他路径.

You have already mapped /api/messages to the getMessagesInJSON method which only allows a GET request. Your POST request is mapping to a different path.

我建议在您的createMessage的请求映射上省略value属性.

I suggest to omit the value attribute on your request mapping for createMessage.

@RequestMapping(method = RequestMethod.POST )

这篇关于Spring MVC HTTP状态405-不支持请求方法"POST"-骨干请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆