Frage

Ich habe ein paar andere Fragen dieser Art gesehen, aber sie passen nicht ganz in die Rechnung.

Ich versuche derzeit, JSON von zwei verschiedenen Controllern zurückzugeben. In einem meiner Controller funktioniert es ohne Probleme, aber wenn ich meinen zweiten Endpunkt drücke, bekomme ich einen 406 -Fehler und kann nicht herausfinden, was los ist. Hier ist die Controller -Aktion:

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

Hier ist das Modell, das ich zurückkehren möchte:

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

Wie Sie aus dem Controller -Code sehen können, besteht meine Ergebnisliste aus Unternehmens -Objekten:

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;
......

Mein Controller gibt also eine @RequestBody -Ergebnisliste zurück, die mit @xmlelement kommentiert wird, und die in der Liste enthaltenen Objekte sind auch mit @xmlelement kommentiert. Das musste ich tun, um das andere Szenario zum Laufen zu bringen. Aber dieser scheitert. Kann mir jemand sagen warum?

War es hilfreich?

Lösung 2

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

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

}

Andere Tipps

Entsprechend Die Liste der HTTP -Antwortcodes 406 (nicht akzeptabel) bedeutet

Die angeforderte Ressource ist nur in der Lage, Inhalte zu generieren, die gemäß den in der Anfrage gesendeten Akzeptanzüberschriften nicht akzeptabel sind.

Daher haben Sie den Header akzeptiert, damit XML akzeptabel ist. In der Regel erwartet JavaScript JSON standardmäßig. Um den Header Accept Header einzustellen, verwenden Sie daher so etwas wie Folgendes:

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

Alternativ können Sie Ihren Webdienst einrichten, um stattdessen Anwendung/JSON zu erstellen.

Vergewissere dich <mvc:annotation-driven> ist im Frühlings -MVC -Kontext. Dieser Fehler tritt auf, wenn Spring MVC @ResponseBody nicht erkennt (HTTPMessageConverter (s) nicht registriert) und versucht daher, das Ergebnisobjekt in das Old Fashion ModelAndview umzuwandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top