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ê?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top