Я пытаюсь вернуть ответ JSON с помощью Spring 3.0.6, но получаю ответ 406 "Неприемлемо", с описанием: "Ресурс, идентифицированный этим запросом, способен генерировать ответы только с характеристиками , неприемлемыми согласно запросу" accept "headers ()."
Я знаю, что очень похожий вопрос задавался раньше, но я не могу заставить его работать для моего проекта, несмотря на множество тестов, и я не понимаю, что делаю неправильно.
В моем Maven pom.xml есть следующее:
org.codehaus.jackson
jackson-mapper-asl
1.8.5
compile
org.codehaus.jackson
jackson-core-asl
1.8.5
compile
В web.xml я ссылаюсь на webmvc-config.xml, и журнал подтверждает, что он загружен.
mainServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/spring/webmvc-config.xml
1
В webmvc-config.xml есть следующее:
Мой контролер:
@Controller
public class ClassifiedController {
@RequestMapping(value = "/classified/{idClassified}", headers = "Accept=*/*",
method = RequestMethod.GET)
@ResponseBody
public final Classified getClassified(@PathVariable final int idClassified) {
...
Я пробовал остроумие h или без параметра заголовков с теми же результатами. Если я вызываю URL-адрес напрямую из Firefox, заголовки запроса содержат следующее (проверено с помощью firebug):
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Если я использую следующий JQuery:
$.ajax({
url: '/classified/38001',
type: 'GET',
dataType: 'json'
});
Отправляются следующие заголовки:
Accept: application/json, text/javascript, */*; q=0.01
В обоих случаях результат - ошибка 406. Я не знаю, что еще я должен проверить, чтобы это работало.
ОБНОВЛЕНИЕ : я решил отладить через Spring и обнаружил, что Джексон был правильно вызван в org.codehaus.jackson.map.ser.StdSerializerProvider метод _findExplicitUntypedSerializer содержит следующий код:
try {
return _createAndCacheUntypedSerializer(runtimeType, property);
} catch (Exception e) {
return null;
}
Это прискорбно, поскольку скрывает источник проблемы. С помощью отладчика я обнаружил, что это исключение содержало очень описательное сообщение об ошибке:
Conflicting getter definitions for property "reminded":
ClassifiedImpl#isReminded(0 params) vs
ClassifiedImpl#getReminded(0 params)
Теперь, когда я вижу, что сообщение об ошибке - глупая ошибка, которую легко исправить, но без этого это было не так очевидно. Фактически, устранение проблемы привело к рабочей сериализации.