Domanda

Ho visto un paio di altre domande di questa natura ma non si adattavano perfettamente al conto.

Attualmente sto cercando di restituire JSON da due diversi controller. In uno dei miei controller, funziona senza problemi, ma quando ho colpito il mio secondo endpoint, ricevo un errore 406 e non riesco a capire cosa c'è che non va. Ecco l'azione del controller:

@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;
}

Ecco il modello che sto tentando di tornare:

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>();
    }
}

Come puoi vedere dal codice del controller, la mia lista dei risultati è composta da oggetti 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;
......

Quindi il mio controller restituisce una lista di risultati @RequestBody, che è annotata con @XMlelement, e gli oggetti contenuti nell'elenco sono anche annotati con @XMlelement. Questo è quello che dovevo fare per far funzionare l'altro scenario. Ma questo fallisce. Qualcuno può dirmi perché?

È stato utile?

Soluzione 2

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

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

}

Altri suggerimenti

Secondo L'elenco dei codici di risposta HTTP 406 (non accettabile) significa

La risorsa richiesta è in grado di generare contenuti non accettabili in base alle intestazioni accettate inviate nella richiesta.

Pertanto probabilmente non hai impostato l'intestazione di accettazione per consentire ad XML di essere accettabile. In genere, JavaScript si aspetta JSON per impostazione predefinita. Pertanto, per impostare l'intestazione di accettazione usa qualcosa come il seguente:

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

In alternativa, è possibile impostare il tuo servizio Web per produrre invece Applicazione/JSON.

Assicurarsi <mvc:annotation-driven> è nel contesto MVC di primavera. Questo errore si verifica quando Spring MVC non riconosce @ResponseBody (non ha registrato HTTPMessageConverter) e quindi cerca di convertire l'oggetto del risultato nel vecchio modello e la Vergura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top