Ошибка 406 при попытке получить JSON из конечной точки - PullRequest
1 голос
/ 17 ноября 2010

Я видел пару других вопросов такого рода, но они не вполне соответствовали требованиям.

В настоящее время я пытаюсь вернуть JSON с двух разных контроллеров. В одном из моих контроллеров это работает без проблем, но когда я достигаю своей второй конечной точки, я получаю ошибку 406, и я не могу понять, что не так. Вот действие контроллера:

@RequestMapping("/v1/companies/name/{companyName}")
public @ResponseBody ResultsList<CompanyResult> getCompaniesByName(@PathVariable("companyName") String companyName) {

    if (StringUtils.isEmpty(companyName)) {
        throw new HttpMessageNotReadableException("blah");
    }

    ResultsList<CompanyResult> results = companySearchService.getCompaniesByName(companyName);

    return results;
}

Вот модель, которую я пытаюсь вернуть:

public class ResultsList<T> {
    @XmlElement(name = "results")
    private ArrayList<T> results;

    public int resultCount() {
        return this.results.size();
    }

    public void addResult(T result) {
        this.results.add(result);
    }

    public ResultsList() {
        this.results = new ArrayList<T>();
    }
}

Как видно из кода контроллера, мой ResultsList состоит из объектов CompanyResult:

public class CompanyResult implements ICompany {
    @XmlElement(name = "companyName")
    private String companyName;

    @XmlElement(name = "symbol")
    private String symbol;

    @XmlElement(name = "city")
    private String city;

    @XmlElement(name = "state")
    private String state;
......

Так что мой контроллер возвращает @RequestBody ResultsList, который аннотирован @XmlElement, а объекты, содержащиеся в списке, также аннотированы @XmlElement. Это то, что я должен был сделать, чтобы другой сценарий работал. Но этот провал. Кто-нибудь может сказать мне, почему?

Ответы [ 3 ]

2 голосов
/ 17 ноября 2010

Согласно список кодов ответов HTTP 406 (Недопустимо) означает

Запрошенный ресурс способен только создания контента не приемлемо в соответствии с отправленными заголовками Accept в запросе.

Поэтому вы, вероятно, не установили заголовок Accept, чтобы XML был приемлемым. Как правило, JavaScript ожидает JSON по умолчанию. Поэтому, чтобы установить заголовок Accept, используйте что-то вроде следующего:

function getCompany() {
 var client = new XMLHttpRequest();
 client.open("GET", "/v1/companies/name/exampleCompany");
 client.setRequestHeader("Accept", "application/xml");
 client.send();
}

В качестве альтернативы, вы можете настроить свой веб-сервис для создания application / json.

1 голос
/ 21 октября 2011

Убедитесь, что <mvc:annotation-driven> находится в контексте Spring MVC.Эта ошибка возникает, когда Spring MVC не распознает @ResponseBody (не имеет зарегистрированных HttpMessageConverter (s)) и, следовательно, пытается преобразовать результирующий объект в старомодный ModelAndView.

1 голос
/ 07 декабря 2010
public class ResultsList<T> {
    private List<T> mResults;

    @JsonGetter("results")
    public final List<T> getResults() {
        return mResults;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...