【问题标题】:Angularjs - Spring MVC integrationAngularjs - Spring MVC 集成
【发布时间】:2012-12-31 19:37:15
【问题描述】:

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

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

controller.js

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

    $scope.submit = function () {

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

            $location.path('/');

        });

    };

    $scope.gotoTodoListPage = function () {

        $location.path("/")

    };

}

services.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);

    }

}

【问题讨论】:

    标签: spring-mvc angularjs restful-architecture


    【解决方案1】:

    修改请求映射以匹配实际映射/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);
    
        }
    

    【讨论】:

    • 通过网络发送的请求是什么样的?你能用萤火虫检查一下然后发帖吗?
    • 请求 URL - localhost:9090/Angular_Spring_Hibernate/rest/todo 方法 - PUT POST 数据内容(根据 firebug) 类型:application/json;charset=utf-8 {"title":"rtrr","description":" rtttrtrt"}
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      首先隔离问题。是 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”。我不认为这些会匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-13
        • 2013-02-26
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        相关资源
        最近更新 更多