3

我正在尝试将 AngularJS 与 Spring MVC 集成;但我无法将参数作为 RequestBody 发布到弹簧控制器。有人可以帮助我实现同样的目标吗?以下是我的程序的简要流程。

完成数据输入后TodoNewController被执行。从这里我调用我在services.js中定义的用户定义方法“ create ” 。根据之后的流程,它应该调用 TodoController.java的create方法以及输入参数;但它没有发生。有人可以让我知道代码有什么问题吗?下面是相同的代码。

控制器.js

function TodoNewController($scope, $location, Todo) {

    $scope.submit = function () {

        Todo.create($scope.todo, function (todo) {

            $location.path('/');

        });

    };

    $scope.gotoTodoListPage = function () {

        $location.path("/")

    };

}

服务.js

angular.module('todoService', ['ngResource']).

        factory('Todo', function ($resource) {

            return $resource('rest/todo/:id', {}, {

                'create': {method:'PUT'}

            });

        });

TodoController.java

@Controller

public class TodoController {

    private static final AtomicLong todoIdGenerator = new AtomicLong(0);

    private static final ConcurrentSkipListMap<Long, Todo> todoRepository = new                ConcurrentSkipListMap<Long, Todo>();

    @RequestMapping(value = "/todo", method = RequestMethod.PUT)

    @ResponseStatus(HttpStatus.NO_CONTENT)

    public void create(@RequestBody Todo todo) {

        long id = todoIdGenerator.incrementAndGet();

        todo.setId(id);

        todoRepository.put(id, todo);

    }

}
4

3 回答 3

2

Spring 期望application/x-www-form-urlencoded作为请求的 Content-Type。您可以尝试注入您的服务并在它的开头$http调用。$http.defaults.headers.put["Content-Type"] = "application/x-www-form-urlencoded";

于 2013-01-21T09:22:18.783 回答
0

修改请求映射以匹配实际映射/rest/todo并将数据绑定更改为使用@ModelAttribute。

 @RequestMapping(value = "/rest/todo", method = RequestMethod.PUT)
 @ResponseStatus(HttpStatus.NO_CONTENT)

    public void create(@ModelAttribute Todo todo) {

        long id = todoIdGenerator.incrementAndGet();

        todo.setId(id);

        todoRepository.put(id, todo);

    }
于 2013-01-17T09:50:39.657 回答
0

首先隔离问题。是 Spring 还是 Angular 导致了这个问题?我建议你在 Chrome 或 FireFox 中安装一个 Rest 客户端插件。然后创建一个 PUT 请求并输入正确的端点 URL。如果您能够收到正确的响应,则意味着您的 Angular 请求构造不正确。

现在,运行基于 Angular 的客户端。发出 PUT 请求。检查发送的参数和请求(在 Chrome 中,您可以使用开发者工具)并查看它是否与您之前发送的请求匹配。如果是这样,那么它应该可以工作。如果没有,那么你就知道问题所在了。

此外,您的 Angular 资源:

$resource('rest/todo/:id')

与 Spring 控制器中的 URL 不同

@RequestMapping(value = "/todo", method = RequestMethod.PUT)

所以第一个就像'rest/todo/1',后者是'/todo'。我不认为那些会匹配。

于 2013-04-25T05:39:11.573 回答