【问题标题】:406 error when attempting to retrieve JSON from endpoint尝试从端点检索 JSON 时出现 406 错误
【发布时间】:2010-11-17 20:31:59
【问题描述】:

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

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

【问题讨论】:

    标签: spring-mvc jackson


    【解决方案1】:

    根据the list of HTTP response codes406(不可接受)表示

    请求的资源只有能力 生成的内容不可接受 根据发送的 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。

    【讨论】:

    • 感谢您的回复,但我对您的回复感到困惑。我的 GET 请求(使用 jQuery.get())请求 JSON。我假设我的控制器也会返回 JSON。您的评论暗示我的控制器正在返回 xml。我的另一个控制器在没有明确告知的情况下返回 JSON,所以我不知道为什么这个控制器会有所不同。
    • 您是否尝试过请求 XML 并查看响应代码是否更改?
    • 另外,你能发布你的 Spring 配置文件吗?
    • @XmlElement 注释对于一个对象来说工作得很好,但是对于我的 ResultsList 对象,我必须向我的 ArrayList 添加一个 getter 并使用 @JsonGetter 对其进行注释。因此,您假设我的端点返回 XML 可能是正确的。现在工作正常。感谢您的提示!
    • @Samo 很高兴帮助回答您的问题。祝你的项目好运。
    【解决方案2】:
    public class ResultsList<T> {
        private List<T> mResults;
    
        @JsonGetter("results")
        public final List<T> getResults() {
            return mResults;
        }
    
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-10
        • 1970-01-01
        • 2020-04-10
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        相关资源
        最近更新 更多