如何使用@MatrixVariable

时间:2016-09-14 15:45:53

标签: javascript angularjs spring-restcontroller

我无法找到使用angularjs' s $ http.get传递过滤器参数的方法。

网址是:

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

RestController是:

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

当我在浏览器中直接使用上面的Url时,它运行正常。但是,当我尝试使用Angularjs的$ http.get尝试调用它时,它无效。

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方法。

如何解决这个问题?

1 个答案:

答案 0 :(得分: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(...

OR

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