@ResponseBody 业务场景使用案例

331 阅读2分钟

@ResponseBody注解,用于指示方法的返回值应该被直接作为 HTTP 响应的正文(Body)返回,而不是返回一个视图(View)。这在开发 RESTful Web 服务时非常有用。

业务场景:

例如你正在开发一个 RESTful API,用于提供用户信息的访问。客户端期望在请求用户信息时,服务器返回 JSON 或 XML 格式的响应。

1. 使用 @ResponseBody 注解:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/users/{userId}")
    @ResponseBody
    public User getUser(@PathVariable Long userId) {
        // 根据 userId 获取用户信息
        User user = userService.getUserById(userId);
        return user;
    }
}

在这个例子中,@RestController 注解表明该类中的所有方法都会返回响应体,而 @ResponseBody 注解则明确告诉 Spring MVC 将 getUser 方法的返回值直接作为 HTTP 响应正文返回。

2. 处理 JSON 响应:

通常,返回的数据结构会序列化为 JSON 格式,以便客户端解析。Spring MVC 可以使用 HttpMessageConverter 来实现这一点。

import com.fasterxml.jackson.databind.ObjectMapper;

@RestController
public class UserController {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @GetMapping("/users/{userId}")
    public ResponseEntity<String> getUser(@PathVariable Long userId) {
        User user = userService.getUserById(userId);
        try {
            String json = objectMapper.writeValueAsString(user);
            return ResponseEntity.ok(json);
        } catch (JsonProcessingException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
        }
    }
}

在这个例子中,我们使用了 Jackson 库的 ObjectMapper 来将 User 对象序列化为 JSON 字符串,并将其封装在 ResponseEntity 中返回。

3. 配置消息转换器:

为了确保 JSON 序列化正常工作,你需要在你的 Spring 配置中配置消息转换器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        return new MappingJackson2HttpMessageConverter();
    }
}

4. 客户端请求:

客户端(可以是浏览器、移动应用或第三方服务)将发送一个 GET 请求到 /users/{userId} 路径,期望接收到用户信息的 JSON 响应。

5. 视图解析器配置:

如果你希望 Spring 能够自动解析返回的对象为 JSON,你可以使用 ResponseBodyAdvice 来实现。

import org.springframework.core.MethodParameter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class JsonResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return MappingJackson2HttpMessageConverter.class.isAssignableFrom(converterType);
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof User) {
            // 可以在这里修改返回的 User 对象,例如添加或删除字段
        }
        return body;
    }
}

总结:

  • @ResponseBody 注解允许开发者返回的数据直接作为 HTTP 响应正文,而不是返回一个视图。
  • 它非常适合用于构建 RESTful API,因为客户端通常期望以 JSON 或 XML 格式接收数据。
  • 使用 @ResponseBody 注解可以提高代码的可读性和可维护性,尤其是在开发 RESTful 服务时。