我在 Spring Boot 中有一个示例 RestController:
@RestController
@RequestMapping("/api")
class MyRestController
{
@GetMapping(path = "/hello")
public JSONObject sayHello()
{
return new JSONObject("{'aa':'bb'}");
}
}
我正在使用 JSON 库 org.json
当我点击 API /hello
时,我得到一个异常说:
Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 java.lang.IllegalArgumentException: No converter found for return value of type: class org.json.JSONObject] 根本原因
java.lang.IllegalArgumentException:没有找到类型的返回值的转换器:类 org.json.JSONObject
问题是什么?有人可以解释到底发生了什么吗?
原文由 iwekesi 发布,翻译遵循 CC BY-SA 4.0 许可协议
当您使用 Spring Boot web 时,Jackson 依赖是隐式的,我们不必显式定义。如果使用 eclipse,您可以在依赖层次选项卡中的
pom.xml
中检查 Jackson 依赖项。正如您使用
@RestController
注释的那样,无需进行显式 json 转换。只需返回一个 POJO,jackson 序列化程序将负责转换为 json。与@Controller一起使用时,相当于使用@ResponseBody
。 Rather than placing@ResponseBody
on every controller method we place@RestController
instead of vanilla@Controller
and@ResponseBody
by default is applied on all resources in that控制器。参考这个链接: https ://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody
您面临的问题是因为返回的对象(JSONObject)没有某些属性的吸气剂。您的意图不是序列化此 JSONObject,而是序列化 POJO。所以只需返回 POJO。
请参阅此链接: https ://stackoverflow.com/a/35822500/5039001
如果要返回 json 序列化字符串,则只需返回该字符串。在这种情况下,Spring 将使用 StringHttpMessageConverter 而不是 JSON 转换器。