2013-01-17 3 views
3

AngularJS를 Spring MVC와 통합하려고합니다. 하지만 스프링 컨트롤러에 RequestBody로 매개 변수를 게시 할 수는 없습니다. 어떤 사람이 저를 달성하도록 도와 줄 수 있습니까? 아래는 내 프로그램의 간단한 흐름입니다.Angularjs - Spring MVC 통합

데이터 입력 후 TodoNewController이 실행됩니다. 여기에서 나는 사용자 정의 메서드 " 만들기"를 호출하고 있는데, 이는 services.js에 정의되어 있습니다. 이 흐름 다음에 흐름을 따라 을 작성하십시오 메소드 TodoController.java와 입력 매개 변수; 그러나 그것은 일어나지 않습니다. 어떤 사람이 코드에 무엇이 잘못되었는지 알려 줄 수 있습니까? 아래는 동일한 코드입니다.

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

    } 

} 

답변

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

    } 
+0

요청이 어떻게 처리되는 것입니까? 당신은 방화범과 게시물로 그것을 확인할 수 있습니까? –

+0

요청 URL -에 http : // localhost를 : 9090/Angular_Spring_Hibernate/휴식/할 일 방법 - (불을 지르고 당) POST 데이터의 내용을 PUT 유형 : 응용 프로그램/JSON; 문자셋 = UTF-8 { "제목" "rtrr", "description": "rtttrtrt"} – Ravi

2

봄에는 요청의 내용 유형으로 application/x-www-form-urlencoded이 필요합니다. $http을 서비스에 삽입하고 $http.defaults.headers.put["Content-Type"] = "application/x-www-form-urlencoded";을 시작할 수 있습니다.

0

먼저 문제를 격리하십시오. 문제의 원인이 봄 또는 각도입니까? Chrome 또는 FireFox에 Rest 클라이언트 플러그인을 설치하는 것이 좋습니다. 그런 다음 PUT 요청을 작성하고 올 Y 른 엔드 포인트 URL을 입력하십시오. 올바른 응답을받을 수 있다면 Angular 요청이 잘못 작성되었음을 의미합니다.

이제 Angular 기반 클라이언트를 실행하십시오. PUT 요청을하십시오. 매개 변수를 검사하고 전송 요청 (Chrome에서 개발자 도구를 사용할 수 있음)하고 이전에 전송 한 요청과 일치하는지 확인합니다. 그럴 경우 작동합니다. 그렇지 않다면, 당신은 그 문제를 안다. 또한

, 당신의 각도 자원 :

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

당신이 당신의 봄 컨트롤러에있는 것보다 다른 URL을 가지고

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

그래서 첫 번째가 같다 '휴식/잭/1' 후자는 '/ todo'입니다. 나는 그것들이 맞을 것이라고 생각하지 않는다.