Question

J'ai vu deux autres questions de cette nature, mais ils ne correspondaient pas tout à fait le projet de loi.

Je suis en train de revenir en JSON de deux contrôleurs différents. Dans l'un de mes contrôleurs, cela fonctionne sans problème, mais quand je frappe mon deuxième point final, je reçois une erreur 406 et je ne peux pas comprendre ce qui ne va pas. Voici l'action du contrôleur:

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

Voici le modèle que je tente de revenir:

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

Comme vous pouvez le voir dans le code du contrôleur, mon ResultsList se compose d'objets 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;
......

Alors mon contrôleur renvoie une @RequestBody ResultsList, qui est annotés avec @XmlElement, et les objets contenus dans la liste sont annotés avec @XmlElement. Voilà ce que je devais faire pour l'autre scénario fonctionne. Mais celui-ci échoue. Quelqu'un peut-il me dire pourquoi?

Était-ce utile?

La solution 2

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

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

}

Autres conseils

Selon la liste des codes de réponse HTTP 406 (Non acceptable) signifie

  

La ressource est seulement capable   de génération de contenu non acceptable   Accepter selon les en-têtes envoyés   dans la demande.

Par conséquent, vous avez probablement pas mis l'en-tête Accept pour permettre XML d'être acceptable. En règle générale, JavaScript attend JSON par défaut. Par conséquent, pour définir la présente comme suit quelque chose utilisation d'en-tête Accept:

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

Vous pouvez configurer votre service Web pour produire à la place application / JSON.

Assurez-vous que <mvc:annotation-driven> est dans le contexte Spring MVC. Cette occurres d'erreur lorsque Spring MVC ne reconnaît pas @ResponseBody (ne pas se sont inscrits HttpMessageConverter (s)) et tente donc de convertir l'objet de résultat à l'ancienne ModelAndView de mode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top