Spring如何自动将对象转换为JSON以供@RestController使用

6

我在查看代码,假设Spring会在幕后使用Jackson,将一个对象自动转换为JSON格式的数据,供@RestController使用。

@RestController 
@RequestMapping("/api")
public class ApiController {

    private RoomServices roomServices;

    @Autowired
    public ApiController(RoomServices roomServices) {
        this.roomServices = roomServices;
    }

    @GetMapping("/rooms")
    public List<Room> getAllRooms() {
        return this.roomServices.getAllRooms();
    }
}

Room类只是一个简单的Java类,具有一些字段、getter/setter。代码中没有使用Jackson或任何其他显式的序列化。尽管这会在检查URL时返回JSON。我试图查看Spring文档,但我不太确定我要找什么。在Spring中,这个过程的名称是什么/它是如何工作的?我尝试使用 @Controller,但它出现了错误。这个功能来自于 @RestController 吗?


1
在方法上使用@ResponseBody,同时也应该使用@Controller - digitalbreed
1个回答

5
如果您正在使用Spring Boot Starter Web,您会发现它通过编译依赖项使用Spring Boot Starter JSON,而Jackson是Start JSON库的依赖项。因此,您的假设是正确的(Spring默认使用Jackson进行Json转换)。
Spring使用其AOP机制拦截@Controller中的映射方法(您可以看到@RestController实际上是一个带有@ResponseBody的@Controller),Spring为使用@Controller注释的类创建代理对象(使用JDK代理或通过cglib)。
当请求流程正在处理时,真正调用映射方法的程序将首先被引导到代理,代理将调用真正的@Controller对象的方法,并使用Jackson库将其返回值转换为Json字符串(如果该方法带有@ResponseBody注释),然后将Json字符串返回给调用程序。

谢谢,Spring 还有其他自动转换的情况吗?还是只有 @ResponseBody 这种情况? - bdehmer
1
据我所知,JSON转换只针对@ResponseBody。但AOP机制在许多地方使用,如Transactional、Cacheable等。 - Michael Ouyang
1
哦!@RequestBody,它将Json字符串转换为对象,也是自动转换。 - Michael Ouyang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接