如何在Spring中注册自定义Body处理器以处理Html类型响应?
让Spring支持ResponseEntity类型响应的配置方法
要让Spring能够处理控制器返回的ResponseEntity<Html>类型响应,你需要自定义一个HttpMessageConverter并将其注册到Spring的消息转换器列表中,具体步骤如下:
1. 自定义HttpMessageConverter实现
创建一个处理Html类型的消息转换器,负责将Html对象序列化为HTML响应体:
import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import java.io.IOException; import java.util.List; public class HtmlMessageConverter implements HttpMessageConverter<Html> { @Override public boolean canRead(Class<?> clazz, MediaType mediaType) { return Html.class.isAssignableFrom(clazz); } @Override public boolean canWrite(Class<?> clazz, MediaType mediaType) { return Html.class.isAssignableFrom(clazz); } @Override public List<MediaType> getSupportedMediaTypes() { return List.of(MediaType.TEXT_HTML); } @Override public Html read(Class<? extends Html> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { // 若无需支持读取请求中的Html类型,直接抛出不支持异常即可 throw new UnsupportedOperationException("Reading Html payloads is not supported"); } @Override public void write(Html html, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { // 设置响应Content-Type为text/html outputMessage.getHeaders().setContentType(MediaType.TEXT_HTML); // 假设Html类的toString()方法返回实际HTML内容,若有专属方法可替换为html.getContent() String htmlContent = html.toString(); outputMessage.getBody().write(htmlContent.getBytes()); } }
2. 注册自定义转换器
通过配置类将自定义转换器注册到Spring容器,有两种方式可选:
方式一:实现WebMvcConfigurer接口
import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new HtmlMessageConverter()); } }
方式二:直接注册为Bean(Spring Boot推荐)
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HtmlConverterConfig { @Bean public HtmlMessageConverter htmlMessageConverter() { return new HtmlMessageConverter(); } }
3. 控制器中使用示例
完成配置后,即可在控制器中直接返回ResponseEntity<Html>:
import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { @GetMapping("/hello") public ResponseEntity<Html> getHello() { String name = "bob"; Html body = HTML.""" <p> Hello \{name} </p> """; return ResponseEntity.ok(body); } }
注意事项
确保你的Html类能够正确提供HTML内容:如果toString()方法不是返回实际HTML代码,需要修改HtmlMessageConverter的write方法,调用Html类中对应的内容获取方法(比如html.getHtmlContent())。
内容的提问来源于stack exchange,提问作者Ethan McCue
相关产品推荐
相关产品推荐

