0

我正在创建一个简单的培训项目。我已经实现了一个控制器方法,它从列表中删除一个项目。该方法如下所示:

@Controller
@RequestMapping(value = "/topic")
public class TopicController {

    @Autowired
    private TopicService service;

    ...

    @RequestMapping(value = "/deleteComment/{commentId}", method = RequestMethod.POST)
    public String deleteComment(@PathVariable int commentId, BindingResult result, Model model){

        Comment deletedComment = commentService.findCommentByID(commentId);
        if (deletedComment != null) {
            commentService.deleteComment(deletedComment);
        }

        return "refresh:";
   }

}

这个方法是从按钮标签中调用的,它的外观如下:

<form><button formaction = "../deleteComment/1" formmethod = "post">delete</button></form>

在我的项目中,表单标签看起来像一个可点击的按钮。但是有一个严重的问题:控制器的方法永远不会被触发。如何使用按钮标签触发它?

PS 调用是从带有 URI http://localhost:8080/simpleblog/topic/details/2的页面执行的,控制器的 URI 是http://localhost:8080/simpleblog/topic/deleteComment/2

更新:

我创建了超链接“删除”,点击应该删除评论,我收到了一个异常

java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

这是真的:我的控制器方法中确实没有@ModelAttribute ,在BindingResult参数之前。但我不知道,应该是哪种类型?

4

1 回答 1

2

<form>method属性是GET默认的。我不知道你想做什么formmethodformaction属性,但在默认的HTML中它们没有任何意义。

您必须尝试以下方法:

<form action="../deleteComment/1" method="post">
    <button>delete</button>
</form>

编辑:

您在方法中声明了一些未使用的参数。BindingResult 必须与带@Valid注释的属性一起使用(@Valid 在此处搜索以查看一些示例),但这不是您的情况。所以,请尝试:

@RequestMapping(value = "/deleteComment/{commentId}", method = RequestMethod.POST)
public String deleteComment(@PathVariable int commentId){
    ...
}
于 2012-09-03T21:36:41.490 回答