不支持请求方法'GET'将@GetMapping更改为Delete方法后出错

时间:2017-02-26 21:24:15

标签: javascript java spring-mvc web-applications hibernate-mapping

我的网络应用程序存在问题。我是一名学生,仍在学习。这是一个简单的论坛,包括登录,注册,添加新主题和帖子。还可以删除无问题的主题GetMapping方法。不幸的是,我得到了一个命令,将GetMapping更改为Delete,并且在更改在内容的应用程序中出现错误之后: “出现意外错误(type = Method Not Allowed,status = 405)。请求方法'GET'不受支持' 我在互联网上寻找解决这个问题,但在检查了各种选项后,仍然是同样的错误。我在这个主题上也没有足够的经验,因此我的很多指示都不清楚。所以请帮忙。

这是删除更改前的topic.html视图:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Forum - Topic</title>
</head>
<body background="http://2.bp.blogspot.com/-BsL9gRE80Ug/U0OgeWbbxtI/AAAAAAAAF-w/teXrzw-TBcU/s1600/nacre-background-tile.jpg">
<table class="table table-striped">
<a href="http://localhost:8080/forum">Powrot</a>
  <tr>
   <th>Title: </th>
	<th><p th:text="${topicName}" /></th>
  </tr>
  <tr>
	<td th:text="${topicAuthor}" ></td>
	<td th:text="${topicDate}" ></td>
	<table border="1">
	<td th:text="${topicContent}"></td>
	</table>
  </tr>
  <table>
	  	<br><b>-------------------------------------------------------</b></br>
	  	<a th:href="@{/new_message(id=${topicId})}">Add new post</a>
	  	<br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br>
	  	<br><b>-------------------------------------------------------</b></br>
  </table>
</table>
<table class="table table-striped">
  <tr th:each="message,iterStat : ${list}">
    <td th:text="${message.author}"></td>
    <td th:text="${message.date}"></td>
    <table border="1">
    	<td th:text="${message.content}"></td>
    </table>
    <table>
    	<p> - - - - - - - - </p>
    </table>
  </tr>
</table>
</body>
</html>

并且在更改之后:

...
    <table>
        <br><b>-------------------------------------------------------</b></br>
        <a th:href="@{/new_message(id=${topicId})}">Add new post</a>
        <form action="#" th:action="@{/delete(id=${topicId})}" method="delete">
      <br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br>
  </form>
        <br><b>-------------------------------------------------------</b></br>
    </table>
...

我也编辑了控制器。这是以前使用getMapping的工作版本:

@Controller public class TopicController
{
@Autowired
private TopicRepository topicRepository;

@Autowired
private MessageRepository messageRepository;

@Autowired
private UserRepository userRepository;

@GetMapping("/delete")
public String deleteTopic(@CookieValue(value = "userId", defaultValue = "-1") String userId, 
        @RequestParam("id") String topicId, Model model)
{
    if(userId.equals("-1"))
    {
        model.addAttribute("user", new User());
        return "login";           
    }
    else
    {
        Topic topic = topicRepository.findByIdIn(Integer.parseInt(topicId));
        if(topic.getUserId() == Integer.parseInt(userId)) 
        {
            topicRepository.delete(topic);
        }
        return "redirect:/forum";
    }

}

}

新版本不起作用:

@RequestMapping(value = "/{delete}", method = RequestMethod.DELETE)
public @ResponseBody String deleteTopic(@CookieValue(value = "userId", defaultValue = "-1") String userId, 
        @RequestParam("id") String topicId, @ModelAttribute Topic topic, Model model)
{
    if(userId.equals("-1"))
    {
        model.addAttribute("user", new User());
        return "login";           
    }
    else
    {
        Topic topicDB = topicRepository.findByIdIn(Integer.parseInt(topicId));
        if(topicDB.getUserId() == Integer.parseInt(userId)) 
        {
            topicRepository.delete(topicDB);
        }
        return "redirect:/forum";
    }
}

1 个答案:

答案 0 :(得分:0)

HTML表单不支持DELETE方法。因此,当您编写以下内容时,您的浏览器只使用正常的GET

<form action="#" th:action="@{/delete(id=${topicId})}" method="delete">

使用POST方法,因为您更改了服务器上的数据。如果您想让应用程序认为使用了DELETE方法,请将HiddenHttpMethodFilter与隐藏字段一起使用,如下所示:

<form action="#" th:action="@{/delete(id=${topicId})}" method="post">
    <input type="hidden" name="_method" value="delete">
    <br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br>
</form>

如果您使用thymeleaf-spring&gt; = 2.0.3,则可以使用th:method属性,如果需要,百里香足够自动创建隐藏字段。

<form action="#" th:action="@{/delete(id=${topicId})}" th:method="delete">
    <br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br>
</form>