406 Erro ao tentar recuperar o JSON do endpoint
-
25-09-2019 - |
Pergunta
Eu vi algumas outras questões dessa natureza, mas elas não se encaixaram na conta.
Atualmente, estou tentando devolver o JSON de dois controladores diferentes. Em um dos meus controladores, funciona sem problemas, mas quando eu atingi meu segundo ponto final, recebo um erro 406 e não consigo descobrir o que está errado. Aqui está a ação do controlador:
@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;
}
Aqui está o modelo que estou tentando retornar:
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>();
}
}
Como você pode ver no código do controlador, minha lista de resultados é composta por objetos da 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;
......
Portanto, meu controlador retorna um @requestbody ResultsList, que é anotado com @xmlelement, e os objetos contidos na lista também são anotados com @xmlelement. É isso que eu tinha que fazer para fazer o outro cenário funcionar. Mas este falha. Alguém pode me dizer o porquê?
Solução 2
public class ResultsList<T> {
private List<T> mResults;
@JsonGetter("results")
public final List<T> getResults() {
return mResults;
}
}
Outras dicas
De acordo com A lista de códigos de resposta HTTP 406 (não aceitável) significa
O recurso solicitado é capaz apenas de gerar conteúdo não aceitável de acordo com os cabeçalhos aceitadores enviados na solicitação.
Portanto, você provavelmente não definiu o cabeçalho de aceitação para permitir que o XML seja aceitável. Normalmente, o JavaScript espera JSON por padrão. Portanto, para definir o cabeçalho aceita, use algo como o seguinte:
function getCompany() {
var client = new XMLHttpRequest();
client.open("GET", "/v1/companies/name/exampleCompany");
client.setRequestHeader("Accept", "application/xml");
client.send();
}
Como alternativa, você pode configurar seu serviço da Web para produzir aplicativos/JSON.
Certificar-se de que <mvc:annotation-driven>
está no contexto do MVC da primavera. Esse erro ocorre quando o Spring MVC não reconhece o @ResponseBody (não registrou httpmessageConverter (s)) e, portanto, tenta converter o objeto de resultado para o modelo de modela e a visão de moda antiga.