Groovy + Dropwizard и проблема с сервлетом 3.1.0

Я пытаюсь создать простой REST-сервер, используя groovy 2.4.1 на основе Dropwizard framework 0.8.1. Отличный сценарий, который я использую для этого доказательства концепции:

import com.codahale.metrics.annotation.Timed
import com.google.common.base.Optional
import io.dropwizard.Application
import io.dropwizard.Configuration
import io.dropwizard.setup.Bootstrap
import io.dropwizard.setup.Environment

import javax.ws.rs.GET
import javax.ws.rs.Path
import javax.ws.rs.Produces
import javax.ws.rs.QueryParam
import javax.ws.rs.core.MediaType

@Grapes([
        @Grab(group = 'io.dropwizard', module = 'dropwizard-core', version = '0.8.1')])

class RESTProviderConfiguration extends Configuration {
    String template
}

class RESTProviderApplication extends Application<RESTProviderConfiguration> {

    @Override
    String getName() {
        'hello-world'
    }

    @Override
    void initialize(Bootstrap<RESTProviderConfiguration> bootstrap) {
    }

    @Override
    void run(RESTProviderConfiguration configuration, Environment environment) {
        def resource = new HelloWorldResource(template: configuration.template);
        environment.jersey().register(resource);
    }
}


@Path('/hello-world')
@Produces(MediaType.APPLICATION_JSON)
class HelloWorldResource {

    String template

    @GET
    @Timed
    String sayHello(@QueryParam('name') Optional<String> name) {
        String.format(template, name.or('John Doe'))
    }
}

new RESTProviderApplication().run(args)

Сервер запускается, но при запросе ресурса /hello-world выдается следующее исключение:

WARN  [2015-05-11 12:17:04,099] org.eclipse.jetty.servlet.ServletHandler: Error for /hello-world
! java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getHeader(Ljava/lang/String;)Ljava/lang/String;
! at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:322) ~[jetty-servlets-9.2.9.v20150224.jar:9.2.9.v20150224]
! at io.dropwizard.jetty.BiDiGzipFilter.doFilter(BiDiGzipFilter.java:134) ~[dropwizard-jetty-0.8.1.jar:0.8.1]
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.9.v20150224.jar:9.2.9.v20150224]
! at io.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:29) ~[dropwizard-servlets-0.8.1.jar:0.8.1]
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.9.v20150224.jar:9.2.9.v20150224]
! at io.dropwizard.jersey.filter.AllowedMethodsFilter.handle(AllowedMethodsFilter.java:44) ~[dropwizard-jersey-0.8.1.jar:0.8.1]
! at io.dropwizard.jersey.filter.AllowedMethodsFilter.doFilter(AllowedMethodsFilter.java:39) ~[dropwizard-jersey-0.8.1.jar:0.8.1]
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [jetty-servlet-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:240) [metrics-jetty9-3.1.1.jar:3.1.1]
! at io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:51) [dropwizard-jetty-0.8.1.jar:0.8.1]
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:159) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.Server.handle(Server.java:497) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) [jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224]
! at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45]
127.0.0.1 - - [11/May/2015:12:17:04 +0000] "GET /hello-world HTTP/1.1" 500 - "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Sa
fari/537.36" 22
WARN  [2015-05-11 12:17:04,104] org.eclipse.jetty.server.HttpChannel: /hello-world
! java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I
! at com.codahale.metrics.jetty9.InstrumentedHandler.updateResponses(InstrumentedHandler.java:291) ~[metrics-jetty9-3.1.1.jar:3.1.1]
! at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:254) ~[metrics-jetty9-3.1.1.jar:3.1.1]
! at io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:51) ~[dropwizard-jetty-0.8.1.jar:0.8.1]
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:159) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.Server.handle(Server.java:497) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) [jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224]
! at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45]
WARN  [2015-05-11 12:17:04,105] org.eclipse.jetty.util.thread.QueuedThreadPool:
! java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I
! at org.eclipse.jetty.server.handler.ErrorHandler.handle(ErrorHandler.java:111) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.Response.sendError(Response.java:597) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpChannel.handleException(HttpChannel.java:486) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpConnection$HttpChannelOverHttp.handleException(HttpConnection.java:576) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:386) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224]
! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224]
! at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45]
WARN  [2015-05-11 12:17:04,105] org.eclipse.jetty.util.thread.QueuedThreadPool: Unexpected thread death: org.eclipse.jetty.util.thread.QueuedThreadPool$3@5bdb85f9 in dw{STARTED,8<=
8<=1024,i=1,q=0}

Это связано с тем, что путь к классам groovy имеет groovy-servlet-2.4.3.jar с версией сервлета 2.4, а dropwizard 0.8.1 имеет javax.servlet-api-3.1.0.jar.

Не подскажете, как заменить groovy jar или сначала загрузить нужную версию?


person Radu C.    schedule 11.05.2015    source источник


Ответы (3)


Я только что столкнулся с подобной проблемой. В моем случае проблема заключалась в том, что была какая-то другая зависимость с javax.servlet-api-2.5.0.jar, поэтому у меня было две версии javax.servlet-api.

mvn dependency:tree -Dincludes=*:*servlet*

mystuff:mystuff:jar:1.0-SNAPSHOT

 mystuff:rest-support:jar:2.0.0-RELEASE:compile

 |  \- com.github.kongchen:swagger-maven-plugin:jar:2.3.4:compile

 |     \- javax.servlet:servlet-api:jar:2.5:compile

 ...

 \- mystuff:myotherstuff:jar:2.2.4:compile

    \- javax.servlet:javax.servlet-api:jar:3.1.0:compile

Я исправил это, вручную исключив swagger-maven-plugin из maven-зависимостей mystuff:rest-support

надеюсь, это поможет

person Alex Shtafinskiy    schedule 31.08.2015

Вы должны добавить javax.servlet-api в качестве явной зависимости с версией 3.1.0 в свой build.gradle.

Это перезаписывает значение по умолчанию, предоставленное groovy.

dependencies {
   compile group: 'javax.servlet', name: 'javax.servlet-api', version:  '3.1.0'
   ...
}
person Janosch Woschitz    schedule 02.09.2015

Несколько вариантов:

  • перед запуском groovy-скриптов захватите и экспортируйте API-интерфейс сервлета в путь к классам, используя: eval $(grape resolve -shell javax.servlet javax.servlet-api 4.0.0)
  • или удалите или замените servlet-api-2.4.jar в $GROOVY_HOME\lib (не рекомендуется)
person dewafer    schedule 27.08.2017