2016-10-22 3 views
0

Я пытаюсь служить значком и некоторыми шрифтами.Подавать favicon.ico и другие статические файлы с помощью VertX

object Lion : AbstractVerticle() { 

    @JvmStatic 
    @Throws(IOException::class) 
    fun main(args: Array<String>) { 

    val vertx = Vertx.vertx() 
    val router = Router.router(vertx) 

    router.route().handler(CorsHandler.create("*") 
     .allowedMethod(HttpMethod.GET) 
     .allowedMethod(HttpMethod.POST) 
     .allowedMethod(HttpMethod.OPTIONS) 
     .allowedHeader("X-PINGARUNER") 
     .allowedHeader("Content-Type")) 

    // some json GET/POST routes here 

    router.route().handler(FaviconHandler.create()); 
    router.route().handler(StaticHandler.create()) 

    vertx.createHttpServer().requestHandler { router.accept(it) }.listen(9090) 
} 

FaviconHandler бросает исключение, создающего «Внутренняя ошибка сервера», когда я иду в http://localhost:9090/favicon.ico Мой Favicon находится в src/main/resources/webroot/favicon.ico

Oct 22, 2016 11:16:42 PM io.vertx.ext.web.impl.RoutingContextImplBase 
SEVERE: Unexpected exception in route 
java.lang.RuntimeException: java.lang.NullPointerException 
    at io.vertx.ext.web.handler.impl.FaviconHandlerImpl.init(FaviconHandlerImpl.java:148) 
    at io.vertx.ext.web.handler.impl.FaviconHandlerImpl.handle(FaviconHandlerImpl.java:155) 
    at io.vertx.ext.web.handler.impl.FaviconHandlerImpl.handle(FaviconHandlerImpl.java:33) 
    at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:215) 
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:78) 
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:94) 
    at io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:121) 
    at io.vertx.ext.web.handler.impl.CorsHandlerImpl.handle(CorsHandlerImpl.java:38) 
    at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:215) 
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:78) 
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:94) 
    at io.vertx.ext.web.impl.RouterImpl.accept(RouterImpl.java:79) 
    at Lion$main$8.handle(Lion.kt:90) 
    at Lion$main$8.handle(Lion.kt:43) 
    at io.vertx.core.http.impl.ServerConnection.handleRequest(ServerConnection.java:286) 
    at io.vertx.core.http.impl.ServerConnection.processMessage(ServerConnection.java:412) 
    at io.vertx.core.http.impl.ServerConnection.handleMessage(ServerConnection.java:139) 
    at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.lambda$createConnAndHandle$1(HttpServerImpl.java:712) 
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:314) 
    at io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:190) 
    at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.createConnAndHandle(HttpServerImpl.java:706) 
    at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:570) 
    at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:522) 
    at io.vertx.core.http.impl.VertxHttpHandler.channelRead(VertxHttpHandler.java:76) 
    at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:122) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:372) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:358) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:350) 
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:372) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:358) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:350) 
    at io.vertx.core.http.impl.HttpServerImpl$Http1xOrHttp2Handler.http1(HttpServerImpl.java:1019) 
    at io.vertx.core.http.impl.HttpServerImpl$Http1xOrHttp2Handler.channelRead(HttpServerImpl.java:990) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:372) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:358) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:350) 
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:372) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:358) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:610) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:551) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:465) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:437) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NullPointerException 
    at io.vertx.ext.web.handler.impl.FaviconHandlerImpl$Icon.<init>(FaviconHandlerImpl.java:61) 
    at io.vertx.ext.web.handler.impl.FaviconHandlerImpl$Icon.<init>(FaviconHandlerImpl.java:40) 
    at io.vertx.ext.web.handler.impl.FaviconHandlerImpl.init(FaviconHandlerImpl.java:143) 
    ... 48 more 

Снятие FaviconHandler и нормальной html, js и css файлы отлично работает, но шрифты не могут служить.

Failed to decode downloaded font: http://localhost:9090/fonts/glyphicons-halflings-regular.woff 
/#/tcr:1 OTS parsing error: incorrect file size in WOFF header 

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

Это похоже на потенциальное решение, но я вижу то, что не является моим значком, а квадратом 16x16 с искаженными линиями в нем, шрифты по-прежнему пытаются загрузить и все еще выдавать ошибку в консоли браузера.

router.route("/favicon.ico").handler { 
     it.response().putHeader("Content-Type", "image/x-icon").sendFile("webroot/favicon.ico") 
    } 

    router.route("/fonts/glyphicons-halflings-regular.woff").handler { 
     it.response().putHeader("Content-Type", "application/font-woff").sendFile("webroot/fonts/glyphicons-halflings-regular.woff") 
    } 

Так, чтобы подвести итог, как мне сделать StaticHandler служить .woff и .ico файлов правильно с правильным Mimetypes и не иметь его загрузить эти файлы?

Решения:

Первая проблема у меня в том, что Maven оттенок не копировать все файлы шрифтов в баночку для какой-либо причины.

Явное копирование файлов шрифтов при сборке и отключении фильтрации ресурсов для шрифтов, похоже, устраняет проблему с шрифтом.

<build> 
    <sourceDirectory>${basedir}/src/main/java</sourceDirectory> 
    <resources> 
     <resource> 
      <directory>${basedir}/src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
     <resource> 
      <directory>${basedir}/src/main/resources/fonts</directory> 
      <filtering>false</filtering> 
     </resource> 
    </resources> 

Затем обслуживая шрифты из каталога ресурсов вместо каталог шрифтов фиксированного его (VertX просто не будет служить из каталога шрифтов по какой-то причине, даже если файлы есть)

enter image description here

Favicon, вероятно, кэшируется, все еще исследуя, что в настоящий момент favicon не так критичен.

router.route("/favicon.ico").handler(FaviconHandler.create("favicon.ico")) 

ответ

3

Favicon.ico:

Просто переместите файл favicon.ico до уровня в resources папку непосредственно:

/src/main/resources/favicon.ico 

В качестве альтернативы изменить FaviconHandler пройти в путь и имя файла:

router.route().handler(FaviconHandler.create(FaviconHandler.create("webroot/favicon.ico"))) 

Ваш код предполагает, что FaviconHandler также относится к webroot, установленному в StaticHandler, но это не так.Это чисто свойство StaticHandler, и поэтому FaviconHandler ищет ресурс в resources/, если вы не укажете относительный путь. Когда этот ресурс не найден, it uses the result of getResourceAsStream("favicon.ico"), который является null и падает.

Если вы посмотрите на модульный тест для FaviconHandlerImpl, вы увидите, что they place the favicon.ico file in the root of resources вместо webroot.


Уофф Файлы:

Что касается ваших файлов шрифтов, которые вы ищете в неправильном месте для этой проблемы. Это не имеет никакого отношения к типам MIME.

Скорее всего, вы повредили файлы WOFF при аварии. Это могло произойти, когда вы взяли их с GIT, и они подумали, что это текстовые файлы, и они сломали концы строк, тем самым развращая их. Или вы использовали плагин Maven Filter, и он сделал то же самое, развращая их. Или вы загрузили/загрузили их через FTP в виде текстовых файлов, та же проблема.

другие сообщения об этом: https://stackoverflow.com/a/33792610/3679676

+0

Maven действительно виноват в этом, во-первых, тень maven не копировала все файлы шрифтов по какой-либо причине (только половина из них), фильтрация ресурсов также искажала его, и даже после того, как я получил его, VertX по-прежнему не служил в каталоге шрифтов, поэтому копирование шрифтов на исправленные ресурсы. См. Мое обновленное решение в моем вопросе. –

1

Вы не укажете свой путь Favicon, так VertX пытается найти по умолчанию одно:

if (path == null) { 
    icon = new Icon(Utils.readResourceToBuffer("favicon.ico")); 
} 

Ваш Favicon расположен в resources/webroot/favicon.ico, но Vertx ищет его на resources/favicon.ico

Таким образом, вы можете указать FaviconHandler.create("webroot/favicon.ico") или переместить его на один каталог вверх.

Что касается файлов WOFF, я не смог воспроизвести проблему, так как WOFF возвращается с application/x-font-woff, что кажется правильным.

+0

Ты отправил мне свой ответ на 5 минут после меня. –

+1

Извините, Джайсон, взял меня, чтобы опубликовать его. Тем не менее, я не думаю, что есть причина злиться, так как я также предоставил способ служить знакомую, не перемещая ее нигде. –

Смежные вопросы