我看到了其他几个这种性质的问题,但他们并不适合这个法案。
我目前正在尝试从两个不同的控制器返回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注释。这是我必须要做的其他方案才能工作。但是这个失败了。谁能告诉我为什么?
答案 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时,会出现此错误。