Angular $resource возвращает исходящий объект, когда веб-сервис возвращает null

У меня есть веб-сервис Java, который я использую для проверки уникальных полей. Он принимает строку и ищет в базе данных объекты, которые уже имеют это значение в одном из своих полей. Конечная точка Java Spring

@RequestMapping(value = "/value", method = RequestMethod.POST)
@ResponseCaching(mode = Mode.NEVER)
@ResponseBody
public Keuze findByValue(@RequestBody final String value) {
    return getService().findByvalue(value);
}

Объект angular $resource:

var resource = $resource('service/:entity/:field', {}, {
    uniqueValue: {
        method: 'POST',
        url: 'service/:entity/:field',
        cache: false
    }
});

Функция в службе проверки, которая выполняет проверку:

function uniqueValue(entity, field, value) {
    return resource.uniqueValue({entity:entity,field:field}, angular.toJson(value)).$promise;
}

Я вызываю эту функцию в директиве, например:

validationService.uniqueValue('keuzes', 'omschrijving', viewValue).then(function(keuze) {
    ctrl.$setValidity('unique', !keuze || keuze.id == scope.keuze.id);
});

Проблема, с которой я сталкиваюсь, заключается в том, что угловой ресурс, кажется, возвращает объект, который был отправлен в веб-сервис, когда сам этот веб-сервис возвращает значение null. Только когда веб-сервис возвращает объект, он работает правильно. Скажем, пользователь вводит значение «тест», тогда в директиве кажется, что веб-сервис вернул следующее:

{
    0: """,
    1: "t",
    2: "e",
    3: "s",
    4: "t",
    5: """
}

Проверка инструментов разработчика Chrome ясно указывает на то, что веб-сервис выполнил свою работу правильно и ничего не вернул.

Ранее я реализовал это с угловым $http, и это работало нормально. Является ли такое поведение angular $resource преднамеренным, и я что-то упустил, или это ошибка? Я не мог найти никаких других ссылок на это поведение в другом месте, что заставляет меня думать, что я делаю что-то не так.

PS: сейчас я использую angular 1.3.2.


person Benne Otten    schedule 02.09.2015    source источник


Ответы (1)


Согласно документации кажется, что вы намеренно получаете ресурс в обработчике успеха: В случае успеха обещание разрешается с тем же экземпляром ресурса или объектом коллекции, обновленным данными с сервера. Это упрощает использование в разделе разрешения функции $routeProvider.when() для отсрочки рендеринга представления до тех пор, пока ресурсы не будут загружены.

person Rob    schedule 02.09.2015
comment
Когда я заменяю angular.toJson(value) функцией «обертывания», angular $resource пытается отправить запрос в конечную точку /service. Кажется, теперь он полностью игнорирует заполнители в URL-адресе. - person Benne Otten; 02.09.2015
comment
Я пытался отправить его без сериализации. Мой бэкэнд Spring ожидает json, поэтому отправка строки без сериализации приводит к ошибкам. Опубликованная вами информация немного объясняет, как работает angular $resource. Я предполагаю, что если с сервера нет данных, angular не может «обновить» объект и просто возвращает исходный объект. Намеренно или нет, это приводит к очень странному поведению. В настоящее время я исправил это, проверив, имеет ли возвращаемый объект поле идентификатора. Если это не так, я знаю, что проверка прошла. Это работает, но кажется хакерским. - person Benne Otten; 02.09.2015