Невозможно прочитать ресурс как поток - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь прочитать файл HTML с диска. Но это всегда возвращает ноль. Я попытался положить везде в каталоге, но все равно он возвращает ноль.

class MainVerticle : AbstractVerticle() {

  override fun start(startPromise: Promise<Void>) {
    vertx
      .createHttpServer()
      .requestHandler { req ->
       req.response()
      .putHeader("content-type", "text/plain")
      .end("Hello from Vert.x!")
     }
     .listen(8888) { http ->
        if (http.succeeded()) {
          startPromise.complete()
          println("HTTP server started on port 8888")
        } else {
          startPromise.fail(http.cause());
        }
      }

    var mailTemplateStream = (getStreamFromRes("emailVerification.html") as 
    InputStream).reader().readText()
    println(mailTemplateStream)

  }

  fun getStreamFromRes(fileName: String): InputStream? {
  val stream = Object::class.java.getResourceAsStream("/$fileName")
  return stream
 }
}

Всегда выдает следующее исключение: -

SEVERE: null cannot be cast to non-null type java.io.InputStream
kotlin.TypeCastException: null cannot be cast to non-null type 
java.io.InputStream
    at example.starter.MainVerticle.start(MainVerticle.kt:26)
    at io.vertx.core.impl.DeploymentManager.lambda$doDeploy$9(DeploymentManager.java:556)
    at 
   io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:369)
at io.vertx.core.impl.EventLoopContext.lambda$executeAsync$0(EventLoopContext.java:38)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518)
at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)

Здесь через функцию getStreamFromRes я пытаюсь получить поток ввода. Я поместил файл emailVerification. html рядом с классом MainVerticle, но он возвращает ноль. Кто-нибудь знает, что я делаю не так?

Обновление: - Я добавил этот проект в свой проект github: - https://github.com/captabhi/abhishek09021998-gmail.com.git

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Ваш проект GitHub немного отличается от кода примеров, который вы предоставили. Я клонировал ваш проект и основывал свой ответ на нем, а не на коде в вопросе.

Правильная реализация getStreamFromRes должна быть:

fun getStreamFromRes(fileName: String) = this::class.java.classLoader.getResourceAsStream(fileName)

Обратите внимание, что нет backsla sh до fileName, поэтому нам также не нужно интерполировать его.

В своем коде вы также можете избежать приведения с использованием

val mailTemplateStream = getStreamFromRes("mail/emailVerification.html")?.reader()?.readText()
0 голосов
/ 31 марта 2020

ваш emailVerification. html файл должен быть скопирован в папку сборки вместе с файлами скомпилированного класса. каждый исходный файл находится в папке ресурсов, это не означает, что он будет автоматически загружен загрузчиком классов. Ваш скрипт сборки должен скопировать ресурсы в папку сборки.

...