c语言编程笔录

首页 >   > 笔记大全

笔记大全

SpringBoot项目中什么情况下需要添加ResponseBody注解

更新时间:2023-12-04
在SpringBoot项目中,当Controller方法返回值是一个对象时,会默认进行JSON序列化并返回。但是,在某些特定情况下,默认的JSON序列化机制可能无法满足需求,这时我们需要使用@ResponseBody注解来手动指定返回的数据类型。 ## 1. 返回List类型数据 当我们需要返回一个List类型的数据时,使用@ResponseBody注解可以确保在返回结果是List时,响应头的Content-Type会被设置为application/json。否则,如果不添加@ResponseBody注解,浏览器可能会将返回数据当做下载文件进行处理。 ```java @GetMapping("/list") @ResponseBody public List getUserList() { List userList = userRepository.findAll(); return userList; } ``` ## 2. 返回Map类型数据 当我们需要返回一个Map类型的数据时,使用@ResponseBody注解可以确保在返回结果是Map时,响应头的Content-Type会被设置为application/json。否则,还是可能会出现浏览器将返回数据当做下载文件进行处理的情况。 ```java @GetMapping("/map") @ResponseBody public Map getMap() { Map map = new HashMap<>(); map.put("name", "Tom"); map.put("age", "18"); return map; } ``` ## 3. 返回String类型数据 当我们需要返回一个String类型的数据时,使用@ResponseBody注解可以确保在返回结果是String时,响应头的Content-Type会被设置为text/plain。否则,可能会出现浏览器将返回数据当做HTML文档进行处理的情况。 ```java @GetMapping("/string") @ResponseBody public String getString() { return "Hello World"; } ``` ## 4. 返回非JSON格式的数据 当我们需要返回的数据不是JSON格式时,使用@ResponseBody注解可以确保在返回结果是非JSON格式时,响应头的Content-Type会被设置为对应的ContentType。否则,可能会出现浏览器将返回数据当做HTML文档进行处理的情况。 ```java @GetMapping("/download") @ResponseBody public ResponseEntity downloadFile() throws IOException { File file = new File("file/path"); InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName())); headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); headers.add("Pragma", "no-cache"); headers.add("Expires", "0"); return ResponseEntity.ok() .headers(headers) .contentLength(file.length()) .contentType(MediaType.parseMediaType("application/octet-stream")) .body(resource); } ``` 以上四种情况是在SpringBoot项目中需要添加@ResponseBody注解的常见情况。使用@ResponseBody注解可以帮助我们确保返回数据的类型和响应头的Content-Type,从而避免一些奇怪的问题。