尝试从端点检索JSON时出现406错误

时间:2010-11-17 20:32:00

标签: spring-mvc jackson

我看到了其他几个这种性质的问题,但他们并不适合这个法案。

我目前正在尝试从两个不同的控制器返回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注释。这是我必须要做的其他方案才能工作。但是这个失败了。谁能告诉我为什么?

3 个答案:

答案 0 :(得分:2)

根据the list of HTTP response codes 406(不可接受)意味着

  

请求的资源仅限   产生不可接受的内容   根据发送的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。

答案 1 :(得分:1)

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

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

}

答案 2 :(得分:1)

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