Spring Boot中ResponseEntity的Body无法转为String的问题解决
问题解决:ResponseEntity Body转String的处理
问题根源
你遇到的ClassCastException是因为Service层返回的ResponseEntity的Body实际是byte数组(byte[]),并非String类型。Redis执行HMGET后返回的结果是二进制字节数组,Postman能正常显示是Spring MVC框架自动将byte数组转成了字符串输出,但手动强转(String)会触发类型转换异常。
解决方案
方法1:直接将byte数组转为String(无需Jackson)
最直接的方式是先判断Body类型为byte[],再通过new String()完成转换:
@GetMapping("/test") public ResponseEntity<?> test(){ ResponseEntity<?> test = redisDemo.test(); if (test.getBody() instanceof byte[]) { String body = new String((byte[]) test.getBody()); System.out.println(body); // 输出andrew;wilson;abcSchool;900 // 此处添加你的业务逻辑 } return new ResponseEntity<>(test.getBody(),HttpStatus.OK); }
注意:如果Redis存储时使用了UTF-8以外的编码,需指定编码参数,例如new String((byte[]) test.getBody(), StandardCharsets.UTF_8)。
方法2:用Jackson的ObjectMapper转换
若必须通过Jackson处理,可借助ObjectMapper的writeValueAsString方法转换,但本质仍需先处理byte数组:
import com.fasterxml.jackson.databind.ObjectMapper; @GetMapping("/test") public ResponseEntity<?> test(){ ResponseEntity<?> test = redisDemo.test(); ObjectMapper objectMapper = new ObjectMapper(); // 也可注入Spring容器中的ObjectMapper实例 try { String body; if (test.getBody() instanceof byte[]) { byte[] bodyBytes = (byte[]) test.getBody(); body = new String(bodyBytes); // 若需将字符串转为Java对象,可继续使用objectMapper.readValue(body, YourTargetClass.class) } else { body = objectMapper.writeValueAsString(test.getBody()); } System.out.println(body); // 业务逻辑处理 } catch (Exception e) { e.printStackTrace(); } return new ResponseEntity<>(test.getBody(),HttpStatus.OK); }
优化建议:从Service层提前处理类型
更规范的做法是在Service层就完成byte数组到String的转换,避免Controller层做类型判断:
// 修改Service的test方法 public ResponseEntity<String> test(){ Object object = executeCommand( "HMGET", "students".getBytes(), "andrew".getBytes() ); ArrayList list = (ArrayList) object; if (list.get(0) instanceof byte[]) { String result = new String((byte[]) list.get(0)); return new ResponseEntity<>(result, HttpStatus.OK); } // 处理空值或异常情况 return new ResponseEntity<>("", HttpStatus.OK); }
此时Controller层可直接获取String类型的Body:
@GetMapping("/test") public ResponseEntity<?> test(){ ResponseEntity<String> test = redisDemo.test(); String body = test.getBody(); System.out.println(body); // 业务逻辑处理 return test; }
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

