Ошибка определения типа: [простой тип, класс io.rsocket.Payload] - PullRequest
0 голосов
/ 27 февраля 2020


Я тестирую 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

...