我的Spring JSON应用程序Spring控制器返回一个JSONObject。在访问网址时,我收到406错误页面。 它在我返回String或ArrayList时有效。
Spring Controller:
package com.mkyong.common.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.JSONException;
import org.json.JSONObject;
@Controller
public class JSONController {
@RequestMapping("/test")
@ResponseBody
public JSONObject test() {
try {
JSONObject result = new JSONObject();
result.put("name", "Dade")
.put("age", 23)
.put("married", false);
return result;
} catch (JSONException ex) {
Logger.getLogger(JSONController.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
我该如何解决这个问题?感谢帮助。我是Spring MVC的新手,在现有的SO答案中无法解决这个问题。
答案 0 :(得分:0)
你正试图为你自动手动执行Spring MVC。 Spring会自动推断出返回类型的表示并进行转换。如何做到这一点,你可以从http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc学习。在你的情况下,它转换为JSON。
当我返回String或ArrayList
时,它可以工作
引擎盖下发生的事情是Spring MVC正在使用Jackson库,将返回类型转换为JSON。因为转换String或List类型没有问题,所以一切正常。
你发布的代码中发生的事情是,Jackson的对象映射器试图将JSONObject实例转换为JSON,这失败了,因为jackson期望JSONObject实例不是POJO对象。
要让它工作,您应该简单地编写POJO并将其返回。像
这样的东西public class Person {
private String name;
private Integer age;
private Boolean married;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getMarried() {
return married;
}
public void setMarried(Boolean married) {
this.married = married;
}
}
并将您的方法更改为
@RequestMapping("/test")
@ResponseBody
public Person test() {
Person person = new Person();
person.setName("Dade");
person.setAge(23);
person.setMarried(false);
return person;
}
对于您的错误,您将在工作示例中看到相同的异常(例如,删除getter和setter,或者错误地命名),尝试转换为表示时发生异常并且出现406错误< / p>
答案 1 :(得分:0)
我认为您需要在@RequestMapping
中设置标头并返回HashMap
。
@RequestMapping(value = "json", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody
Map<String, String> helloJson() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
return map;
}