2015-03-15 4 views
2

Я хочу отправить и получить HashMap через angularjs и получить его в контроллере springmvc. Я успешно отправил и получил List, но не смог отправить HashMap. Мой код есть.

$scope.addskill = function(skills){  
// $scope.list = [];  
// $scope.list.push(skills.skillName, skills.expMonth, skills.expYear, skills.experties);   
    var map = {}; 
    map['name'] = skills.skillName; 
    map['month'] = skills.expMonth; 
    map['year'] = skills.expYear; 
    map['experties'] = skills.experties; 

    alert(map['name']); 
    var response = $http.get('/JobSearch/user/addskill/?map=' +map); 
// var response = $http.get('/JobSearch/user/addskill/?list=' +$scope.list); 
    response.success(function(data, status, headers, config){ 
     $scope.skills = null; 
     $timeout($scope.refreshskill,1000);    
    });    
    response.error(function(data, status, headers, config) { 
     alert("Exception details: " + JSON.stringify({data: data})); 
    });  
}; 

Мой MVC контроллер:

@RequestMapping(value = "/addskill", method = RequestMethod.GET) 
@ResponseStatus(value = HttpStatus.NO_CONTENT) 
public void addStudentSkill(@RequestBody HashMap<String,String> map){ 

    System.out.println(map.get("name")); 
/*  
*  public void addStudentSkill(@RequestParam("list") List list){ 
    try{  
     StudentSkills skills = new StudentSkills(); 
     skills.setSkillName(list[0]); 
     skills.setExpMonth(Integer.parseInt(list[1])); 
     skills.setExpYear(Integer.parseInt(list[2])); 
     skills.setExperties(list[3]); 
     skills.setStudent(studentService.getStudent(getStudentName())); 
     studentService.addStudentSkill(skills); 
    }catch(Exception e){}; 

*/ 
} 

комментируемые код работает, когда я отправлять и получать список. Я хочу использовать ключ для извлечения данных. Если есть лучший способ, пожалуйста, предложите.

ошибка не может преобразовать java.lang.String в HashMap

ответ

3

Вы посылаете карту в качестве параметра запроса. И вы пытаетесь прочитать его в теле запроса. Это не может работать. И запросы GET не имеют тела в любом случае.

Вот как вы должны это сделать:

var parameters = {}; 
parameters.name = skills.skillName; 
parameters.month = skills.expMonth; 
parameters.year = skills.expYear; 
parameters.experties = skills.experties; 

var promise = $http.get('/JobSearch/user/addskill', { 
    params: parameters 
}); 

И в контроллере Spring:

@RequestMapping(value = "/addskill", method = RequestMethod.GET) 
@ResponseStatus(value = HttpStatus.NO_CONTENT) 
public void addStudentSkill(@RequestParam("name") String name, 
          @RequestParam("name") String month, 
          @RequestParam("name") String year, 
          @RequestParam("name") String experties) { 
    ... 
} 

Тем не менее, учитывая имя метода addStudentSkill, а также тот факт, что он не вернуть что-либо, кажется, этот метод не используется для получения данных с сервера, а вместо этого для создания данных на сервере. Таким образом, этот метод должен быть отображен на запрос POST, и данные должны быть посланы как тело:

var data = {}; 
data.name = skills.skillName; 
data.month = skills.expMonth; 
data.year = skills.expYear; 
data.experties = skills.experties; 

var promise = $http.post('/JobSearch/user/addskill', params); 

и в контроллере:

@RequestMapping(value = "/addskill", method = RequestMethod.POST) 
@ResponseStatus(value = HttpStatus.CREATED) 
public void addStudentSkill(@RequestBody Map<String, String> data) { 
    ... 
} 
+0

необходимо CSRF маркер при отправке запроса пост. также @requestParam HashMap map не работает, но список String [] работает в запросе get. – Kharoud

+0

Если токен CSRF необходимо отправить, отправьте его ... Не используйте GET, когда должен использоваться POST. –

+0

Мои данные могут быть переданы через запрос получения, хотя и немного громоздки, но я думаю, что я не должен использовать токен безопасности CSRF, если это не совсем необходимо. Спасибо, что ответ был полезен. – Kharoud

Смежные вопросы