【发布时间】:2011-10-21 13:37:23
【问题描述】:
我正在尝试让一些 REST 方法在我的 Spring 应用程序中运行,但似乎收效甚微。我显然错过了一些东西,但我无法告诉我这将是什么。这是我的控制器:
@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 - Request method 'POST' not supported 错误。如您所见,我的控制器中有方法处理程序,所以我真的不确定我做错了什么。我已经从 Spring in Action 3 书中删除了这些处理程序,它也类似于一些 Spring 文档和内容所说的,但显然我缺少一个关键组件。有人有什么想法吗?
我的 web.xml 中确实有 HiddenHttpMethodFilter 映射,这就是我使用 Spring 表单标签的原因。
无论如何,感谢您的任何想法或帮助。谢谢。
------------------更新------------------
这是我单击按钮并收到 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
【问题讨论】:
-
>但是,当我尝试使用此表单返回 Json 时,我收到了 405... 您发送的请求看起来如何。
-
去掉
headers="Content Type=application/json"约束还能用吗? -
@Ralph 不,同样的结果。此外,是否有必要让它知道它正在获取 Json 对象并可以对其进行解码?
-
对“/home/data”的 Json 请求。它真的包含更改方法(HiddenHttpMethodFilter)的参数吗?请用一些工具检查这个或在
HiddenHttpMethodFilter中设置一个断点 -
当我检查 JSP 的源代码时,它确实创建了一个具有适当值的隐藏输入。所以是的,我假设它确实如此。但是,我不会在服务器端重新使用该方法,以便能够进一步评估。
标签: spring rest spring-mvc