我在Spring Boot中有一个示例RestController:
@RestController @RequestMapping("/api") class MyRestController { @GetMapping(path = "/hello") public JSONObject sayHello() { return new JSONObject("{'aa':'bb'}"); } }
我正在使用JSON库 org.json
org.json
当我点击API时/hello,我得到一个异常提示:
/hello
路径为[]的Servlet [dispatcherServlet]的Servlet.service()抛出异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:未找到类型为org.json.JSONObject]的返回值的转换器,其根本原因是 java.lang.IllegalArgumentException:未找到类型为org.json.JSONObject的返回值的转换器
路径为[]的Servlet [dispatcherServlet]的Servlet.service()抛出异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:未找到类型为org.json.JSONObject]的返回值的转换器,其根本原因是
java.lang.IllegalArgumentException:未找到类型为org.json.JSONObject的返回值的转换器
有什么问题 有人可以解释到底发生了什么吗?
当您使用Spring Boot Web时,Jackson依赖关系是隐式的,我们不必显式定义。pom.xml如果使用eclipse ,则可以在依赖项层次结构选项卡中检查Jackson依赖项。
pom.xml
并且正如您所注释的那样,@RestController无需进行显式的json转换。只需返回一个POJO,杰克逊序列化器将负责转换为json。@ResponseBody与@Controller 一起使用时,等效于使用。而不是放置@ResponseBody在每个控制器方法上,我们放置的@RestController不是香草@Controller,而是@ResponseBody默认情况下应用于该控制器中的所有资源。
@RestController
@ResponseBody
@Controller
您面临的问题是因为返回的对象(JSONObject)没有某些属性的吸气剂。您的意图不是序列化此JSONObject而是序列化POJO。因此,只需返回POJO。
如果要返回json序列化的字符串,则只需返回该字符串。在这种情况下,Spring将使用StringHttpMessageConverter而不是JSON转换器。