2016-09-14 1 views
0

Я не могу найти способ использования $ http.get angularjs для передачи параметров фильтра.Как передать параметры фильтра от angularjs до spring restcontroller с помощью @MatrixVariable

Ссылка:

http://localhost:8080/template/users/query;username=abcd;firstName=ding... 

RestController является:

@RequestMapping(value={"https://stackoverflow.com/users/{query}"}, method=RequestMethod.GET) 
public ResponseEntity<List<User>> queryUsers(@MatrixVariable(pathVar="query") Map<String, List<String>> filters) { 
    .... 
} 

Когда я использую выше Url непосредственно в браузере он работает нормально. Однако, когда я пытаюсь вызвать то же самое с помощью http.get файла Angularjs, он не работает.

Angularjs код:

this.searchUser = function() { 
     var queryStr = ''; 
     for (var key in userObj.search) { 
      if (userObj.search[key]) { 
       queryStr += ";" + key + "=" + userObj.search[key]; 
      } 
     } 
     console.log('Url ', 'users/query' + queryStr); 
     if (queryStr === "") { 
      alert("No filters specified"); 
      return false; 
     } 
     $http.get('users/query', angular.toJson(userObj.search)).then(function successCallback(response) { 
      if (response.data.errorCode) { 
       console.log(response); 
       alert(response.data.message); 
      } else { 
       console.log('Successfully queried for users ', response.data); 
       userObj.users = response.data; 
      } 
     }, function errorCallback(response) { 
      console.log('Error ', response); 
      alert(response.statusText); 
     }); 
    }; 

Когда я называю этот метод: я получаю ошибку, как

errorCode: 400 
message: "Failed to convert value of type [java.lang.String] to required type [long]; nested exception is java.lang.NumberFormatException: For input string: "query"" 

Даже я попытался передать строку запроса, как это указано выше в URL, но по-прежнему такая же ошибка. Я уверен, что он даже не входит в метод RestController.

Как это решить?

ответ

0

Использование get, вы не можете передавать JSON.

Вы должны подготовить объект, если хотите передать ему строку запроса.

var queryStr = {}; 
for (var key in userObj.search) { 
    if (userObj.search[key]) { 
     queryStr[key] = userObj.search[key]; 
    } 
} 

И ваш HTTP#GET вызов должен быть таким:

$http.get('users/query', {params: queryStr}).then(... 

ИЛИ

$http({ 
    url: 'users/query', 
    method: "GET", 
    params: queryStr 
}); 
+0

Я изменил код, как вы упомянули, но все та же проблема. –

+0

Я вижу ошибку Исключение: TypeError: «вызывающий» и «аргумент» являются ограниченными функциями функции и в этом контексте недоступны. в функции Function.remoteFunction (: 3: 14)] в инструментах Chrome dev –

+0

Это похоже на проблему с URL-адресом, где размещается Angularjs? и & when params. Но с весенним контроллером MatrixVariable он ожидает; а также ,. С матричной переменной не работает? а также &. На данный момент я не уверен, как рассказать Ангулярцам; и в URL. Если кто-нибудь знает, пожалуйста, дайте мне знать. –