Spring MVC HTTP状态405 - 请求方法'POST'不受支持 - Backbone请求

4

我是Spring MVC的新手,正在尝试使用Spring MVC + Hibernate从头开始构建Web应用程序,以提供类似于JSON Rest API的服务,并通过Backbone在客户端消费该API。为此,我已经开始按照这个教程(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这样完成的:

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

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

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

是否有人遇到过同样的问题?

我在这里留下我的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);
    }

}

非常感谢您!
3个回答

6
您已经将 /api/messages 映射到只允许 GET 请求的 getMessagesInJSON 方法。您的 POST 请求正在映射到不同的路径。
我建议省略 createMessage 的请求映射中的 value 属性。
@RequestMapping(method = RequestMethod.POST )

是的!那就是问题所在。你知道为什么会发生这种情况吗?谢谢 ;) - jantunes
我还没有查看代码,但我怀疑它与请求映射值匹配实际请求路径有关。为了避免这种情况在未来发生,最好不要将映射到“/”,而是将其留空。 - Bart

0

我认为问题在于您的@RequestMapping位于类定义的顶部,并与每个方法前面的@RequestMapping注释中关联到value参数的字符串发生冲突。相比之下,我会从以下几点开始编写类:

@Controller
@SessionAttributes(types = SomeClassName.class)
public class SomeClassNameController {  

然后,您可以在每个方法前面使用@RequestMapping注释中的value参数。

0

还要记住的是,如果您正在实现用于异常处理的/error端点,则可能会发生此错误。 如果您的/error端点具有方法类型,并且它与抛出异常的端点的方法不匹配,则可能会出现405错误。 如果是这种情况,请从错误端点中删除方法类型以提供服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接