REST方法不会PUT或POST到服务器

时间:2011-10-21 13:37:24

标签: spring rest spring-mvc

我正在尝试在我的Spring应用程序中使用一些REST方法,但似乎收效甚微。我显然错过了一些东西,但我不知道我的生活会是什么。这是我的控制器:

@Controller
public class IndexController {
    static Logger log = Logger.getLogger(IndexController.class);

    @Autowired
    private ProvisionService provisionService;

    @RequestMapping(value="/home/data", method=RequestMethod.GET,
                    headers="Accept=application/json")
    public @ResponseBody List<Provision> getData() {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = null;

        if(principal instanceof UserDetails)
            username = ((UserDetails)principal).getUsername();

        return provisionService.getAllByUser(username);
    }

    //JSON put request - doesn't work currently
    @RequestMapping(value="/home/data", method=RequestMethod.PUT,
                    headers="Content-Type=application/json")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void updateProvisions(@RequestBody List<Provision> provisions) {
        log.info("Provisions: " + provisions.toString());
    }

    @RequestMapping(value={"/","/home"}, method=RequestMethod.GET)
    public void showIndex() {}
}

以下是使用它的JSP的主要部分:

<sf:form id="homeForm" method="put" action="${homeData_url}"></sf:form>

当用户点击按钮时,表单通过Javascript提交。无论如何,GET的工作正常。我让Json带着我的对象列表返回,没问题。然后我用Dojo显示它,到目前为止一直很好。但是,当我尝试使用此表单返回Json时,我得到405 - 请求方法'POST'不支持错误。正如你所看到的,我在Controller中有方法处理程序,所以我真的不确定我做错了什么。我把这些处理程序从Spring in Action 3书中拿出来,它也类似于一些Spring文档和东西所说的,但显然我缺少一个关键组件。有人有什么想法吗?

我的web.xml中有HiddenHttpMethodFilter映射,这就是我使用Spring表单标记的原因。

无论如何,任何想法或帮助都表示赞赏。谢谢。

------------------ UPDATE ------------------

以下是点击按钮后得到405错误的标题,如果有帮助:

http://localhost:8080/NFI/home

POST /NFI/home HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
Referer: http://localhost:8080/NFI/home
Cookie: JSESSIONID=584AC21ADE4F214904B9E7E2370363EF
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

HTTP/1.1 405 Method Not Allowed
Server: Apache-Coyote/1.1
Allow: GET, PUT
Content-Type: text/html;charset=utf-8
Content-Length: 1085
Date: Fri, 21 Oct 2011 15:39:26 GMT

3 个答案:

答案 0 :(得分:0)

使用POST完成提交表单。您收到“POST”不支持错误。

上面,我看到你在源代码中使用了RequestMethod.PUT。根本没有提到POST。

答案 1 :(得分:0)

您需要为您的请求添加值_method的参数PUT。不是json的内容!

因此,在第一步中,我会将请求的网址更改为/home/data?_method=PUT

如果这项工作,您可以搜索如何将_method参数添加到请求内容而不会干扰Json数据的方法。

答案 2 :(得分:0)

您使用标题更新了问题,是否还可以将整个请求放在那里(实际转储值)以查看正在发送的_method参数?

此外,虽然我猜header =“” - 规则是有效的,但不应该需要它们。你有一个json转换器bean,它将根据内容类型进行编组和解组,并接受标头,如果没有找到有效的转换器,Spring将返回错误。

将它包含在@RequestMapping中的唯一原因是,如果你使用xml而不是json调用它而实际上做了其他的方法,那听起来就像是一个糟糕的设计。

删除这些标题规则并重试,尽可能简单并逐步添加逻辑。