Я тестирую RSocket с Spring Boot. Одним из моих вариантов использования является передача файла с сервера. Я взял пример из https://github.com/rsocket/rsocket-java/tree/develop/rsocket-examples/src/main/java/io/rsocket/examples/transport/tcp/resume и изменил его для использования с Spring.
На стороне клиента я получаю следующую ошибку:
Определение типа ошибка: [простой тип, класс io.rsocket.Payload]; вложенное исключение: com.faster xml .jackson.databind.ex c .InvalidDefinitionException: невозможно создать экземпляр `` ´´´io.rsocket.Payload` (не существует создателей, таких как конструкция по умолчанию): также абстрактные типы необходимо сопоставить с конкретными типами, иметь собственный десериализатор или содержать дополнительную информацию о типе в [Source: (io.netty.buffer.ByteBufInputStream); строка: -1, столбец: 0]
Мой код клиента выглядит следующим образом:
@RestController
@RequestMapping("/files")
public class FileController {
private static final Logger LOG=LoggerFactory.getLogger(FileController.class);
private static String URL = "ws://localhost:8081/websocket";
@Autowired
private RSocketStrategies rSocketStrategies;
@RequestMapping(value = "/getfile", method = RequestMethod.GET)
public void getFile() throws Exception {
URI uri = URI.create(URL);
RSocketRequester r= RSocketRequester.builder() //
.rsocketStrategies(rSocketStrategies) //
.dataMimeType(MediaType.APPLICATION_CBOR) //
// .metadataMimeType(MediaType.APPLICATION_CBOR)
.connectWebSocket(uri).block();
FileRequest fr = new FileRequest(16, "static/index.html");
Flux<Payload> resp=r.route("getfile") //
.data(fr) //
.retrieveFlux(Payload.class);
resp.subscribe(Files.fileSink("d://temp/index.txt", FileRequest.PREFETCH_WINDOW_SIZE));
}
}
Метод ответа сервера выглядит следующим образом:
@MessageMapping(value="getfile")
public Flux<Payload> getFile(FileRequest request) {
String fileName = request.getFileName();
int chunkSize = request.getChunkSize();
Flux<Long> ticks = Flux.interval(Duration.ofMillis(500)).onBackpressureDrop();
return Files.fileSource(fileName, chunkSize)
.map(DefaultPayload::create)
.zipWith(ticks, (p, tick) -> p);
}
Есть идеи, что мне здесь не хватает? Я пытался использовать настройку dataMimeType для других пользователей.
С уважением,
Joga