我在Spring启动时有一个示例Rest Controller:
@RestController
@RequestMapping("/api")
class MyRestController
{
@GetMapping(path = "/hello")
public JSONObject sayHello()
{
return new JSONObject("{'aa':'bb'}");
}
}
我正在使用json库:org.json
当我点击api /你好时,我得到一个异常说:
servlet [dispatcherServlet]的Servlet.service()在上下文中与path []引发了异常[请求处理失败;嵌套异常是java.lang.IllegalArgumentException:找不到类型为:class org.json.JSONObject的返回值的转换器,其根本原因为java.lang.IllegalArgumentException:找不到类型为:class org.json.JSONObject的返回值的转换器
问题是什么有人可以解释究竟发生了什么 . 我是SpringBoot的新手 .
提前致谢 :)
5 回答
当您使用spring boot web时,jackson依赖是隐式的,我们不必明确定义 . 如果使用eclipse,您可以在依赖关系层次结构选项卡中检查pom.xml中的jackson依赖项 .
由于您使用_2532332注释,因此无需进行显式json转换 . 只需返回一个POJO和jackson序列化器将负责转换为json . 它等同于在与@Controller一起使用时使用
@ResponseBody
. 我们不会在每个控制器方法上放置@ResponseBody
,而是将@RestController
而不是vanilla@Controller
和@ResponseBody
默认应用于该控制器中的所有资源 .Refer this link: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody
您遇到的问题是因为返回的对象(JSONObject)没有某些属性的getter . 并且您的目的不是序列化此JSONObject,而是序列化POJO . 所以只需返回POJO .
Refer this link: https://stackoverflow.com/a/35822500/5039001
如果要返回json序列化字符串,则只返回字符串 . 在这种情况下,Spring将使用StringHttpMessageConverter而不是JSON转换器 .
您当前的方法不知道如何序列化
JSONObject
的原因 . 如果要创建动态JSON结构,可以使用Map
,例如:这将导致以下JSON响应:
这有点受限,因为添加子对象可能会变得有点困难 . Jackson 有自己的机制,使用
ObjectNode
和ArrayNode
. 要使用它,您必须在服务/控制器中自动装配ObjectMapper
. 然后你可以使用:此方法允许您添加子对象,数组和使用所有各种类型 .
您可以按照@vagaasen的建议将响应返回为
String
,也可以使用Spring提供的ResponseEntity
Object,如下所示 . 通过这种方式,您还可以返回Http status code
,这在webservice调用中更有帮助 .你也可以使用hashmap
PS . 仅适用于1个值