Ошибка Ajax при запуске jQuery getJSON

Я запускаю этот асинхронный вызов getJSON в jQuery, чтобы получить данные обратно в мой код Java, а затем из него. По какой-то причине я постоянно получаю сообщение об ошибке:

"Ajax Error: Error invoking generateSearchQuery([object Object])"

Я отлаживал код jQuery и Java. Код Java получает данные JSON, обрабатывает их и без проблем записывает обратно. Код jQuery сбрасывает ошибку, когда попадает во внутренний метод getJson и пытается выполнить if(json.successful).

Ответ: {"error":{"message":"","title":"Error Generating Search Query"},"data":[Ljava.lang.String;@1e40c9f,"successful":"successful"}

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

jQuery-функция:

generate : function(){

    getJson(
        Search.guid,
        "generateSearchQuery",
        {
            "data": [
                "val0",
                "val1",
                "val2",
                "val3",
                "val4"
            ]
        }, function(json) {
            Search.data = $.parseJSON(json.data);

            $.each(Search.data, function(k, v){
                $('#searchQuery').append(v + "\n");
            });
        });
},

Java-функция:

    @AsyncService(name = "generateSearchQuery", permission = "")
    public void generateSearchQuery(HttpServletRequest req, HttpServletResponse res) {
        res.setHeader("Cache-Control", "no-cache");
        JSONResult result = new JSONResult("Error Generating Search Query");

        String[] arr = req.getParameterValues("data[]");

        for(int i = 0; i< arr.length; i++){
            arr[i] = "success"+i+"!";
        }

        result.put("data", arr);

        try {
            res.getWriter().print(result);
        } catch (IOException e) {
            // whatever
        }
    }
}

получитьJson:

function getJson(guid, service, parms, callback) {
    beginWork();
    $
            .ajax( {
                url : document.URL,
                type : 'GET',
                data : parms,
                cache : 'false',
                dataType : 'json',
                headers : {
                    'framework-guid' : guid,
                    'async-service' : service
                },
                success : function(json) {
                    endWork();
                    if (json.successful) {
                        callback(json);
                    } else {
                        error(json.error && json.error.title ? json.error.title
                                : 'No Title Provided', json.error
                                && json.error.message ? json.error.message
                                : 'No message provided for service ' + service);
                    }
                },
                error : function(jqXHR, textStatus, errorThrown) {
                    endWork();
                    error('Ajax Error', 'Error invoking ' + service + '('
                            + parms + ')');
                }
            });
}

person PseudoPsyche    schedule 19.06.2012    source источник
comment
Stack Overflow не является службой отладки Вам следует попробовать отладить код, определить, в чем проблема, затем спросить конкретного вопрос.   -  person gdoron is supporting Monica    schedule 19.06.2012
comment
Может быть, это потому, что у вас getJSON вместо $.getJSON?   -  person ayyp    schedule 19.06.2012
comment
Что такое getJson? Это оболочка для $.getJSON? $.getJSON принимает только 3 параметра, а также анализирует JSON (нет необходимости в $.parseJSON ).   -  person Rocket Hazmat    schedule 19.06.2012
comment
@gdoron, я его отлаживал. Кажется, все работает нормально, пока он не попадет в метод jQuery getJSON, где он проверяет: if (json.successful) { затем выдает ошибку, затем запускает мой Java-код, но не передает результат обратно на сторону jQuery.   -  person PseudoPsyche    schedule 19.06.2012
comment
Как выглядит ответ. Поместите это на страницу. Используйте такой инструмент, как Fiddler, чтобы получить ответ.   -  person epascarello    schedule 19.06.2012
comment
Итак, я изменил его на $.getJSON и получил "Ajax Error: error". Я отлаживал его, и он собирался использовать совершенно другой метод, поэтому я думаю, что getJson может быть чем-то, что было написано кем-то другим. Я разместил это в ОП.   -  person PseudoPsyche    schedule 19.06.2012
comment
Ответ: {"error":{"message":"","title":"Error Generating Search Query"},"data":[Ljava.lang.String;@1e40c9f,"successful":"successful"}   -  person PseudoPsyche    schedule 19.06.2012
comment
@PseudoPsyche ответ не кажется действительным!   -  person Mihai Stancu    schedule 19.06.2012
comment
Я проверил, у вас там неправильный ярлык Ljava.lang.String;@1e40c9f   -  person Mihai Stancu    schedule 19.06.2012


Ответы (2)


Похоже, что содержимое ответа сервера не было в формате json. Поскольку вы указываете тип ответа $.ajax как json, вам нужно преобразовать результат объекта в json. Вы можете использовать google gson http://code.google.com/p/google-gson/ и сделайте что-то вроде следующего.

Gson gson = new Gson();
res.getWriter().print(gson.toJson(result));

А в getJson следует внести следующие изменения.

//before
Search.data = $.parseJSON(json.data);
//after
Search.data = json.data;
person guanxiaohua2k6    schedule 19.06.2012
comment
Это сработало в первый раз, но во второй раз, когда я попытался запустить его, консоль вывела json is null в if(json.successful). - person PseudoPsyche; 19.06.2012
comment
Ах, неважно! Я перезапустил свой сервер JBoss, и все работает нормально! Спасибо! Это также было довольно удобно, так как я уже использую Gson в другом месте этого приложения, поэтому библиотеки уже были там. - person PseudoPsyche; 19.06.2012
comment
Я не могу найти причину объяснить это. Но очевидно, что вы должны вернуть строку в формате json на сервер, если вы используете такой javascript. - person guanxiaohua2k6; 19.06.2012

Ответ не кажется действительным!

Я проверил это, у вас есть недопустимая метка Ljava.lang.String;@1e40c9f, ошибка, которую я получаю при анализе вашего кода:

SyntaxError: invalid label
person Mihai Stancu    schedule 19.06.2012