Kotlin / Dropwizard中的子资源定位器

我正在尝试使用Kotlin 1.0.3在Dropwizard 1.0中使用子资源来实现资源。 我有一个示例资源:

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() } } 

和一个子资源:

 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() } } 

如果我将子资源函数的返回types从Any更改为TestSubResource ,则一切正常。 我想使用Any作为返回types,这样我可以根据{foo}的值返回不同的子资源。

当使用Any ,dropwizard炸开长堆栈启动…

 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.(ApplicationHandler.java:347) ! at org.glassfish.jersey.servlet.WebComponent.(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) 

有没有一种方法来实现与kotlin / dropwizard的子资源定位器,以便我可以根据自己的自定义逻辑动态地返回几个子资源之一 – 即使用任何返回types?

当Jersey使用Polymorphic资源返回一个也可能是资源的types时,它会在请求期间的运行时解析这个子资源。 DropWizard几乎使用泽西岛,因此将支持这种使用情况。

但是,DropWizard有一个function来记录正在建立的路由绑定的输出,在那里输出在Servlet init期间确定的资源配置。 而这个代码有一个错误。 我在这里报告了确切的错误:

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

我没有看到一个简单的解决办法,例如关闭日志记录,也不注销事件。 看来需要对DropWizard进行修补。

更新:这个问题已经通过pull请求https://github.com/dropwizard/dropwizard/pull/1718解决了,如果你跟踪下一个版本使用合并到master ,它将包括此修复程序。