Spring mvc Angularjs-Spring MVC集成
我正在尝试将AngularJS与Spring MVC集成;但我不能将参数作为RequestBody发布到spring控制器。有人能帮我实现同样的目标吗。下面是我的程序的简要流程 执行数据输入后,执行TodoNewController。从这里我调用用户定义的方法“create”,我在services.js中定义了该方法。根据之后的流程,它应该调用TodoController.java的create方法以及输入参数;但事实并非如此。谁能告诉我代码有什么问题吗。下面是相同的代码 controller.jsSpring mvc Angularjs-Spring MVC集成,spring-mvc,angularjs,restful-architecture,Spring Mvc,Angularjs,Restful Architecture,我正在尝试将AngularJS与Spring MVC集成;但我不能将参数作为RequestBody发布到spring控制器。有人能帮我实现同样的目标吗。下面是我的程序的简要流程 执行数据输入后,执行TodoNewController。从这里我调用用户定义的方法“create”,我在services.js中定义了该方法。根据之后的流程,它应该调用TodoController.java的create方法以及输入参数;但事实并非如此。谁能告诉我代码有什么问题吗。下面是相同的代码 controller.
function TodoNewController($scope, $location, Todo) {
$scope.submit = function () {
Todo.create($scope.todo, function (todo) {
$location.path('/');
});
};
$scope.gotoTodoListPage = function () {
$location.path("/")
};
}
angular.module('todoService', ['ngResource']).
factory('Todo', function ($resource) {
return $resource('rest/todo/:id', {}, {
'create': {method:'PUT'}
});
});
services.js
function TodoNewController($scope, $location, Todo) {
$scope.submit = function () {
Todo.create($scope.todo, function (todo) {
$location.path('/');
});
};
$scope.gotoTodoListPage = function () {
$location.path("/")
};
}
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);
}
}
@控制器
公共类TodoController{
专用静态最终AtomicLong todoIdGenerator=新AtomicLong(0);
私有静态最终ConcurrentSkipListMap todoRepository=新ConcurrentSkipListMap();
@RequestMapping(value=“/todo”,method=RequestMethod.PUT)
@ResponseStatus(HttpStatus.无内容)
创建公共void(@RequestBody Todo Todo){
long id=todoIdGenerator.incrementAndGet();
todo.setId(id);
todoRepository.put(id,todo);
}
}
修改请求映射以匹配实际映射/rest/todo
,并将数据绑定更改为使用@modeldattribute
@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);
}
Spring期望
application/x-www-form-urlencoded
作为请求的内容类型。您可以尝试将$http
注入服务并调用$http.defaults.headers.put[“Content Type”]=“application/x-www-form-urlencoded”代码>在它的开头。首先隔离问题。是弹簧还是角度导致了问题?我建议您在Chrome或FireFox中安装Rest客户端插件。然后创建一个PUT请求并输入正确的端点URL。如果您能够收到正确的响应,则表示您的角度请求构造不正确
现在,运行基于Angular的客户端。提出请求。检查发送的参数和请求(在Chrome中,您可以使用开发人员工具),并查看它是否与您先前发送的请求匹配。如果是这样,那么它应该会起作用。如果没有,那么你知道问题所在
此外,您的角度资源:
$resource('rest/todo/:id')
与Spring控制器中的URL不同
@RequestMapping(value = "/todo", method = RequestMethod.PUT)
因此,第一个类似于“rest/todo/1”,而第二个类似于“/todo”。我认为这两个条件不匹配。通过电话线发出的请求是什么样的?你能用firebug和post检查一下吗?请求URL-方法-发布数据内容(根据firebug)类型:application/json;charset=utf-8{“title”:“rtrr”,“description”:“rtttrtrt”}