2016-08-31 2 views
0

Я пытаюсь реализовать ресурс с subresource в Dropwizard 1.0, используя Kotlin 1.0.3. У меня есть ресурс образца:Локаторы подресурсов в Kotlin/Dropwizard

package net.reznik.stackoverflow.resources 

import javax.ws.rs.Consumes 
import javax.ws.rs.Path 
import javax.ws.rs.PathParam 
import javax.ws.rs.Produces 
import javax.ws.rs.core.MediaType 

@Path("/test") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
class TestResource { 

    @Path("/{foo}/") 
    fun subresource(@PathParam("foo") foo: String): Any { 
     return TestSubResource() 
    } 
} 

И в subresource:

package net.reznik.stackoverflow.resources 

import javax.ws.rs.POST 
import javax.ws.rs.Path 
import javax.ws.rs.core.MediaType 
import javax.ws.rs.core.Response 

class TestSubResource { 

    @POST 
    @Path("/bar") 
    fun bar(request: String): Response { 
     return Response.ok("entity received: $request", MediaType.TEXT_PLAIN_TYPE).build() 
    } 
} 

Если изменить тип возвращаемого значения функции subresource от Any до TestSubResource, то все работает, как ожидалось. Я бы хотел использовать Any как возвращаемый тип, чтобы я мог возвращать разные подресурсы в зависимости от значения {foo}.

При использовании Any, dropwizard взрывается при запуске с длинной StackTrace ...

WARN [2016-08-31 22:01:32,454] /: unavailable 
! java.lang.NullPointerException: null 
! at io.dropwizard.jersey.DropwizardResourceConfig$EndpointLogger.populate(DropwizardResourceConfig.java:173) 
! at io.dropwizard.jersey.DropwizardResourceConfig$EndpointLogger.populate(DropwizardResourceConfig.java:164) 
! at io.dropwizard.jersey.DropwizardResourceConfig$EndpointLogger.populate(DropwizardResourceConfig.java:189) 
! at io.dropwizard.jersey.DropwizardResourceConfig$EndpointLogger.populate(DropwizardResourceConfig.java:164) 
! at io.dropwizard.jersey.DropwizardResourceConfig$EndpointLogger.populate(DropwizardResourceConfig.java:159) 
! at io.dropwizard.jersey.DropwizardResourceConfig.getEndpointsInfo(DropwizardResourceConfig.java:130) 
! at io.dropwizard.jersey.DropwizardResourceConfig.logComponents(DropwizardResourceConfig.java:80) 
! at io.dropwizard.jersey.DropwizardResourceConfig$ComponentLoggingListener.onEvent(DropwizardResourceConfig.java:245) 
! at org.glassfish.jersey.server.internal.monitoring.CompositeApplicationEventListener.onEvent(CompositeApplicationEventListener.java:74) 
! at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:629) 
! at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184) 
! at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350) 
! at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347) 
! at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
! at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
! at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) 
! at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:347) 
! at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:392) 
! at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177) 
! at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369) 
! at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
! at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:640) 
! at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:419) 
! at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875) 
! at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:349) 
! at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) 
! at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262) 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
! at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
! at com.codahale.metrics.jetty9.InstrumentedHandler.doStart(InstrumentedHandler.java:103) 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
! at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
! at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
! at org.eclipse.jetty.server.handler.gzip.GzipHandler.doStart(GzipHandler.java:231) 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
! at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
! at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
! at org.eclipse.jetty.server.handler.StatisticsHandler.doStart(StatisticsHandler.java:252) 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
! at org.eclipse.jetty.server.Server.start(Server.java:411) 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
! at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
! at org.eclipse.jetty.server.Server.doStart(Server.java:378) 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
! at io.dropwizard.cli.ServerCommand.run(ServerCommand.java:53) 
! at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:44) 
! at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:85) 
! at io.dropwizard.cli.Cli.run(Cli.java:75) 
! at io.dropwizard.Application.run(Application.java:79) 

Есть ли способ реализации subresource локатора с Котлином/dropwizard таким образом, что я могу динамически возвращать одно из нескольких subresources основанный на моей собственной логике - т. е. использовать возвращаемый тип Any?

+0

Я знаком с Джерси, JAX-RS 2.0 и Kotlin, но у меня нет опыта работы с Dropwizard. Насколько схожи ваши под-ресурсы? Могут ли они реализовать общий интерфейс, а затем вы можете использовать это вместо «Любые»? – mfulton26

+0

Я тоже пытался использовать этот подход, но получаю ту же ошибку. Также попытался расширить java.lang.Object, так же плохо, как кажется, но имел ту же проблему. – Baron

+0

Возможно, Dropwizard не поддерживает полиморфные подресурсы, он, по-видимому, создает только статическую модель дерева ресурсов. Или это еще одна ошибка с Any/Object как возвращаемый тип. На самом деле ваша ошибка при регистрации конечных точек, были проблемы с журналом subresource, поэтому, возможно, это не учитывало случай Any/Object, потому что это делается в Serlvet Init, когда тип неизвестен. –

ответ

0

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

Но у DropWizard есть функция для регистрации вывода выполняемых привязок маршрутизации, где он выдает конфигурацию ресурсов, определенную им во время инициализации сервлета. И этот код имеет ошибку. Я сообщил точную ошибке здесь:

https://github.com/dropwizard/dropwizard/issues/1716

Я не вижу легкую работу вокруг таких, как превратить это протоколирование вызов с ни разрегистрацией события. Похоже, в DropWizard необходимо сделать патч.

UPDATE: этот вопрос был решен путем вытягивания запроса https://github.com/dropwizard/dropwizard/pull/1718 и если вы отслеживаете следующий релиз, используя которые сливаются в master он будет включать в себя это исправление.

+0

Благодарим за сообщение об ошибке непосредственно dropwizard - это было быстрое исправление! – Baron

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