无响应式的绳子铸造身体

问题描述 投票:0回答:1

在我的环境中,我正在测试一些。从

Spring Boot
我返回
API
无论如何,当我尝试在
Service
上课时收集身体,我会变得异常。
服务类方法:

ResponseEntity

Controller类方法:

controller

我能够在邮递员的AS
中得到回应

@Service public class RedisDemo { private final RedisTemplate<String, String> redisTemplate; @Autowired public RedisDemo(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } public Object executeCommand(String command, byte[]... parts) { return redisTemplate.execute(connection -> connection.execute(command, parts), true ); } public ResponseEntity<?> test(){ Object object = executeCommand( "HMGET", "students".getBytes(), "andrew".getBytes() ); ArrayList list = (ArrayList) object; return new ResponseEntity<>(list.get(0),HttpStatus.OK); }

如果我在控制器中删除
@GetMapping("/test") public ResponseEntity<?> test(){ ResponseEntity<?> test = redisDemo.test(); //String body = (String)test.getBody(); //System.out.println(body); return new ResponseEntity<>(test.getBody(),HttpStatus.OK); }

线,则为了获得响应主体。我要低于例外:

andrew;wilson;abcSchool;900enter image description here


我可以在
String body
中内联响应,以便我可以做一些逻辑。我从

java.lang.ClassCastException: class [B cannot be cast to class java.lang.String ([B and java.lang.String are in module java.base of loader 'bootstrap') at com.self.student.controller.MainController.test(MainController.java:113) ~[classes/:na] enter image description here 我必须在内部使用

String

库或使用

responseEntity.getBody()
库。如果可以使用它们的解决方案,如何使用它们中的任何一个。
	
我认为你想知道,
HMGET

为什么此代码工作并返回正确的响应? - >好吧,这是因为这一行:

redis server
实际上,该代码在独立运行时不会丢任何错误,因为它只是向前test.getbody()(是一个字节[]),而无需任何类型的铸造。春天这样照顾了它:

java spring-boot spring-data-redis
1个回答
1
投票

检查数据类型:test.getbody()是一个字节[],并且使用redistemplate.execute()从redis中拉出。

使用httpmessageconverter

:Spring自动选择ByTearrayHttpMessageConverter来处理字节[]。该转换器以二进制格式发送原始数据,默认情况下将内容类型设置为应用程序/八位字节。

将其显示在客户端sid
    e:Postman获取二进制数据,将其识别为UTF-8字符串(例如“ Andrew; Wilson; abcschool; 900”),并将其显示为文本。
  • about您的错误:

    Jackson
  • 这是因为从redis返回的数据(通过redistemplate.execute)实际上是一个字节[]([b in Java中),而不是字符串。
  • 为什么这是发生的?

    list.get(0)是一个字节[],而不是字符串。
  • 当您尝试将test.getbody()施放到控制器中时,Java会引发错误,因为您无法将字节直接施放到字符串。
  • Solution:在返回IT之前将字节[]转换为字符串

    ObjectMapper

最终输出

现在,当您使用Postman调用API时,您仍然会得到:
“安德鲁;威尔逊; ABCSCHOOL; 900”

但是这次,您的控制器将其作为适当的字符串

处理

about您的错误:

public ResponseEntity<?> test() { ResponseEntity<?> test = redisDemo.test(); return new ResponseEntity<>(test.getBody(), HttpStatus.OK); }

发生例外是因为您的redis命令的响应主体实际上是字节数组(

return new ResponseEntity<>(test.getBody(), HttpStatus.OK);

),而不是字符串。当您将其直接施放到字符串上时,它会失败。您只需要将字节数组转换为字符串。

java.lang.ClassCastException: class [B cannot be cast to class java.lang.String

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.