Spring MVC ajax表单提交

时间:2014-08-09 13:47:58

标签: ajax json spring-mvc

我有两个实体: Word 笔记本。我试图使用jQuery ajax method.将数据保存到数据库中Spring MVC可以设置为自动将传入的JSON字符串绑定到Java对象中,并且效果很好。但是有一个与外键相关的问题。如果我的Word实体依赖于Notebook实体,该怎么办?

以下是我向Controller发送请求的方式

$.ajax({
    type: "POST",
    url: "/doAddWord",
    data: JSON.stringify({ word: word, translation: translation, transcription: transcription, example: examples }),
    contentType: 'application/json',
    success: function() {
       alert('success');
           }
      });

这是控制器中的方法:

@RequestMapping(value = "/doAddWord", method = RequestMethod.POST, headers = {"Content-type=application/json"})
    @ResponseBody
    public void addWord(@RequestBody Word word, HttpSession session) {
        Integer userId = (Integer)session.getAttribute("userId");
        Notebook notebook = notebookService.findByName("default", userId);
        word.setNotebook(notebook);
        wordService.add(word);
    }

因此,您可以在我的控制器中看到我通过笔记本名称从数据库中获取笔记本(现在它是硬编码的"默认")和用户ID。在我的jquery代码中,我应该发送笔记本名称。我不能只是将笔记本名称添加到我的json中,因为我得到500 Erorr并导致它不仅仅是String它是Object。

有没有办法如何发送到控制器多数据:json和一些值,或者可能是我可以实现它的其他一些提示。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以使用网址指定要添加字词的笔记本(RESTful approach):

@RequestMapping(value = "/notebooks/{name}/words", method = RequestMethod.POST, headers = {"Content-type=application/json"})
@ResponseBody
public void addWord(
    @PathVariable("name") String notebookName, 
    @RequestBody Word word, 
    HttpSession session) { ... }

或者,如果您更喜欢RPC样式方法,则可以将笔记本名称添加到命令对象:

@RequestMapping(value = "/doAddWord", method = RequestMethod.POST, headers = {"Content-type=application/json"})
@ResponseBody
public void addWord(@RequestBody AddWordCommand command, HttpSession session) { ... }

public class AddWordCommand {
    private String notebookName;
    private Word word;
    ...
}