Spring Controller返回Boolean报HttpMessageNotWritableException问题求助
解决Spring Controller返回Boolean指定text/plain时的转换错误
Spring默认没有提供将java.lang.Boolean直接转换为text/plain类型响应的HttpMessageConverter,因此抛出HttpMessageNotWritableException。以下是几种可行的解决方法:
方法一:直接返回String类型
将返回值改为String,手动把布尔值转成"true"或"false"字符串,完全符合text/plain的响应格式要求,代码最简单直观:
@RequestMapping(value="/test", method=RequestMethod.POST, produces= "text/plain") public String test() { boolean result = true; // 替换为你的业务逻辑计算结果 return String.valueOf(result); }
方法二:自定义HttpMessageConverter
如果不想修改Controller的返回类型,可以自定义一个转换器,让Spring支持Boolean到text/plain的转换:
1. 实现自定义转换器
import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import java.io.IOException; import java.nio.charset.StandardCharsets; public class BooleanTextPlainConverter extends AbstractHttpMessageConverter<Boolean> { public BooleanTextPlainConverter() { super(MediaType.TEXT_PLAIN); } @Override protected boolean supports(Class<?> clazz) { return Boolean.class.isAssignableFrom(clazz); } @Override protected Boolean readInternal(Class<? extends Boolean> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { // 若不需要处理text/plain格式的布尔请求,可返回null或抛出异常 return Boolean.parseBoolean(new String(inputMessage.getBody().readAllBytes(), StandardCharsets.UTF_8)); } @Override protected void writeInternal(Boolean aBoolean, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { outputMessage.getBody().write(aBoolean.toString().getBytes(StandardCharsets.UTF_8)); } }
2. 注册转换器到Spring容器
在Spring Boot中,通过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 WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new BooleanTextPlainConverter()); } }
配置完成后,原来的Controller方法无需修改即可正常返回text/plain格式的布尔值。
方法三:使用ResponseEntity手动构建响应
通过ResponseEntity手动指定响应的Content-Type和响应体,灵活控制输出格式:
import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RequestMapping(value="/test", method=RequestMethod.POST) public ResponseEntity<String> test() { boolean result = false; // 替换为你的业务逻辑计算结果 return ResponseEntity.ok() .contentType(MediaType.TEXT_PLAIN) .body(String.valueOf(result)); }
内容的提问来源于stack exchange,提问作者Akhil Korissery
相关产品推荐
相关产品推荐

