Spring MVC 自定义返回值处理器HandlerMethodReturnValueHandler
HandlerMethodReturnValueHandler 接口定义了控制器返回值的处理规则,可将返回值转换为响应内容。
接口定义
Java
public interface HandlerMethodReturnValueHandler {
boolean supportsReturnType(MethodParameter returnType);
void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception;
}
核心方法
| 方法 | 作用 |
|---|---|
| supportsReturnType | 判断是否支持该返回类型 |
| handleReturnValue | 处理返回值并写入响应 |
自定义返回值处理器
Java
public class XmlReturnValueHandler implements HandlerMethodReturnValueHandler {
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return returnType.hasMethodAnnotation(XmlResponse.class);
}
@Override
public void handleReturnValue(Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
response.setContentType("application/xml;charset=UTF-8");
// 使用 JAXB 或其他库序列化为 XML
String xml = convertToXml(returnValue);
response.getWriter().write(xml);
mavContainer.setRequestHandled(true);
}
private String convertToXml(Object obj) {
// XML 序列化逻辑
return "<result>" + obj.toString() + "</result>";
}
}
自定义注解标记
Java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XmlResponse {
}
控制器使用
Java
@RestController
@RequestMapping("/api")
public class DataController {
@GetMapping("/data")
@XmlResponse
public Data getData() {
return new Data("test", 100);
}
}
注册返回值处理器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(new XmlReturnValueHandler());
}
}
内置处理器
| 处理器 | 支持返回类型 |
|---|---|
| ModelAndViewMethodReturnValueHandler | ModelAndView |
| ViewMethodReturnValueHandler | View |
| RequestResponseBodyMethodProcessor | @ResponseBody |
| HttpEntityMethodProcessor | HttpEntity |
调用 mavContainer.setRequestHandled(true) 表示已处理请求,不再进行视图渲染。
要点总结
- supportsReturnType 匹配返回类型或方法注解
- handleReturnValue 负责写入响应内容
- 必须设置 requestHandled 阻止后续处理
- 通过 addReturnValueHandlers 注册自定义处理器
📝 发现内容有误?点击此处直接编辑