You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:43:21