【问题标题】:Groovy + Dropwizard and servlet 3.1.0 issueGroovy + Dropwizard 和 servlet 3.1.0 问题
【发布时间】:2017-08-27 23:42:39
【问题描述】:

我正在尝试使用基于 Dropwizard 框架 0.8.1 的 groovy 2.4.1 创建一个简单的 REST 服务器。我用于这个概念证明的 groovy 脚本是:

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 servlet 版本,而 dropwizard 0.8.1 具有 javax.servlet-api-3.1.0.jar。

你能告诉我如何替换 groovy jar 或先加载所需的版本吗?

【问题讨论】:

    标签: groovy dropwizard servlet-3.1


    【解决方案1】:

    我刚刚遇到了类似的问题。在我的情况下,问题是有一些其他依赖项有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
    

    我通过从 mystuff:rest-support 的 maven 依赖项中手动排除 swagger-maven-plugin 来修复它

    希望有帮助

    【讨论】:

      【解决方案2】:

      您必须在 build.gradle 中添加 javax.servlet-api 作为版本 3.1.0 的显式依赖项。

      这会覆盖 groovy 提供的默认值。

      dependencies {
         compile group: 'javax.servlet', name: 'javax.servlet-api', version:  '3.1.0'
         ...
      }
      

      【讨论】:

        【解决方案3】:

        几个选项:

        • 在运行 groovy 脚本之前,使用:eval $(grape resolve -shell javax.servlet javax.servlet-api 4.0.0) 抓取 servlet api 并将其导出到类路径中
        • 或删除或替换servlet-api-2.4.jar 中的$GROOVY_HOME\lib(不推荐)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多