2010-11-17 6 views
1

Я видел пару других вопросов такого рода, но они не совсем соответствовали счету.Ошибка 406 при попытке получить JSON с конечной точки

В настоящее время я пытаюсь вернуть 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. Это то, что я должен был сделать, чтобы заставить другой сценарий работать. Но это не удается. Может ли кто-нибудь сказать мне, почему?

ответ

1
public class ResultsList<T> { 
    private List<T> mResults; 

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

} 
2

В соответствии с the list of HTTP response codes 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(); 
} 

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

+0

Благодарим вас за ответ, но я смущен вашим ответом. Мой запрос GET (с помощью jQuery.get()) запрашивает JSON. Я предположил, что мой контроллер будет также возвращать JSON. Ваш комментарий подразумевает, что мой контроллер возвращает xml. Мой другой контроллер возвращает JSON без явного указания сделать это, поэтому я не знаю, почему этот контроллер будет другим. – Samo

+0

Вы пробовали просить XML и видите, изменился ли код ответа? –

+0

Также вы можете разместить свой конфигурационный файл Spring? –

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^