Spring-MVC 406 неприемлемо вместо ответа JSON

Я пытаюсь вернуть ответ 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)

Теперь, когда я вижу, что сообщение об ошибке - глупая ошибка, которую легко исправить, но без этого это было не так очевидно. Фактически, устранение проблемы привело к рабочей сериализации.

13
задан Community 23 May 2017 в 12:34
поделиться