代码之家  ›  专栏  ›  技术社区  ›  Samo

406尝试从终结点检索JSON时出错

  •  1
  • Samo  · 技术社区  · 15 年前

    我看到了另外几个这样的问题,但它们不太符合要求。

    我正在尝试从两个不同的控制器返回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,它用@xmlement注释,列表中包含的对象也用@xmlement注释。这就是我要做的,才能让另一个场景发挥作用。但这次失败了。有人能告诉我为什么吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Gary    15 年前

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

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

    因此,您可能没有将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。

        2
  •  1
  •   Samo    15 年前
    public class ResultsList<T> {
        private List<T> mResults;
    
        @JsonGetter("results")
        public final List<T> getResults() {
            return mResults;
        }
    
    }
    
        3
  •  1
  •   McGarnagle    13 年前

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