2016-08-31 20 views
0

私は、Kotlin 1.0.3を使用しているDropwizard 1.0のサブリソースを持つリソースを実装しようとしています。私は、サンプル・リソースを持っている: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() 
    } 
} 

そしてサブリソース:

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

私はAnyからTestSubResourceにサブリソース関数の戻り値の型を変更する場合は、予想通り、その後、すべての作品。戻り値の型としてAnyを使用して、{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.<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) 

は私が動的にいくつかのサブリソースのいずれかを返すことができるようにkotlin/dropwizardとサブリソースロケータを実装する方法はあります...長いスタックトレースを起動するに吹きます私の独自のカスタムロジックに基づいています - つまり、戻り値のタイプは Anyですか?

+0

私はJersey、JAX-RS 2.0、Kotlinに精通していますが、私はDropwizardの経験がありません。あなたのサブリソースはどれくらい似ていますか?彼らは共通のインターフェイスを実装することができますし、 'Any'の代わりにそれを使うことができますか? – mfulton26

+0

私はこのアプローチも試みましたが、同じエラーが発生します。また、java.lang.Objectから拡張しようとしましたが、それは同じように悪いですが、同じ問題がありました。 – Baron

+0

Dropwizardは多相サブリソースをサポートしていない可能性があります。リソースツリーの静的モデルのみを構築しているようです。またはこれは戻り値の型としてAny/Objectを持つ別のバグです。実際にはあなたのエラーはエンドポイントのロギング中ですが、サブリソースのロギングに問題があったので、型がわからないときにSerlvet Initで行われるため、Any/Objectのケースを考慮しませんでした。 –

答えて

0

Jerseyは、リソースでもある可能性がある型を返すポリモーフィックリソースで動作するとき、要求時にこのサブリソースを実行時に解決します。 DropWizardはJerseyをそのまま使用しているため、このユースケースをサポートします。

しかし、DropWizardにはルーティングバインディングの出力を記録する機能があり、Servlet initで決定したリソース構成が出力されます。このコードにはバグがあります。私はこのロギングコールをオフにもイベントを登録解除などの周りに簡単に作品を見ていない

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

:私はここで正確なバグを報告しました。 DropWizardにパッチを適用する必要があるようだ。

UPDATE:この問題はプル要求https://github.com/dropwizard/dropwizard/pull/1718によって解決されていて、あなたはそれがmasterにマージ使用して、次のリリースを追跡する場合には、この修正プログラムが含まれます。

+0

バグを直接dropwizardに報告してくれてありがとう - すばらしいバグ修正です! – Baron

関連する問題