我正在尝试在我的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
答案 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调用它而实际上做了其他的方法,那听起来就像是一个糟糕的设计。
删除这些标题规则并重试,尽可能简单并逐步添加逻辑。