1

我看到了其他几个类似的问题,但它们并不完全符合要求。

我目前正在尝试从两个不同的控制器返回 JSON。在我的一个控制器中,它可以正常工作,但是当我到达第二个端点时,我收到 406 错误,我不知道出了什么问题。这是控制器动作:

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

这是我试图返回的模型:

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

从控制器代码中可以看出,我的 ResultsList 由 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;
......

所以我的控制器返回了一个@RequestBody ResultsList,它带有@XmlElement注解,并且列表中包含的对象也带有@XmlElement注解。这是我必须做的才能让其他场景正常工作。但是这个失败了。谁能告诉我为什么?

4

3 回答 3

2

根据HTTP 响应代码列表406 (Not Acceptable) 表示

请求的资源只能生成根据请求中发送的 Accept 标头不可接受的内容。

因此,您可能没有设置 Accept 标头以允许接受 XML。通常,JavaScript 默认需要 JSON。因此,要设置 Accept 标头,请使用以下内容:

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

或者,您可以将 Web 服务设置为生成 application/json。

于 2010-11-17T20:50:44.753 回答
1
public class ResultsList<T> {
    private List<T> mResults;

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

}
于 2010-12-07T18:30:34.343 回答
1

确保<mvc:annotation-driven>在 Spring MVC 上下文中。当 Spring MVC 无法识别 @ResponseBody(没有注册 HttpMessageConverter(s))并因此尝试将结果对象转换为旧式 ModelAndView 时,会发生此错误。

于 2011-10-21T10:19:34.270 回答