Spring Boot + Jetty + Jersey 不会启动:"工厂描述符的创建必须将工厂作为第一个参数的契约"



无法使用嵌入式Jetty servlet容器和Jersey启动Spring Boot应用程序。我使用的是Spring Boot版本1.4.1。

错误信息如下:

Creation of FactoryDescriptors must have Factory as a contract of the first argument

下面是完整的堆栈跟踪:
 org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Jetty servlet container
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer.start(JettyEmbeddedServletContainer.java:143) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:297) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:145) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at com.example.MyApplication.main(MyApplication.java:14) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_40]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_40]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_40]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_40]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.4.1.RELEASE.jar:1.4.1.RELEASE]
Caused by: javax.servlet.ServletException: com.example.config.JerseyConfig@c2666de==org.glassfish.jersey.servlet.ServletContainer,-1,false
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:661) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:419) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedWebAppContext$JettyEmbeddedServletHandler.deferredInitialize(JettyEmbeddedWebAppContext.java:46) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedWebAppContext.deferredInitialize(JettyEmbeddedWebAppContext.java:36) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer.handleDeferredInitialize(JettyEmbeddedServletContainer.java:186) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    at org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainer.start(JettyEmbeddedServletContainer.java:121) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
    ... 15 common frames omitted
Caused by: java.lang.IllegalArgumentException: Creation of FactoryDescriptors must have Factory as a contract of the first argument
    at org.glassfish.hk2.utilities.FactoryDescriptorsImpl.<init>(FactoryDescriptorsImpl.java:78) ~[hk2-api-2.5.0-b05.jar:na]
    at org.glassfish.hk2.utilities.binding.AbstractBindingBuilder$FactoryTypeBasedBindingBuilder.complete(AbstractBindingBuilder.java:454) ~[hk2-api-2.5.0-b05.jar:na]
    at org.glassfish.hk2.utilities.binding.AbstractBinder.resetBuilder(AbstractBinder.java:180) ~[hk2-api-2.5.0-b05.jar:na]
    at org.glassfish.hk2.utilities.binding.AbstractBinder.complete(AbstractBinder.java:190) ~[hk2-api-2.5.0-b05.jar:na]
    at org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:174) ~[hk2-api-2.5.0-b05.jar:na]
    at org.glassfish.jersey.model.internal.CommonConfig.configureBinders(CommonConfig.java:676) ~[jersey-common-2.23.2.jar:na]
    at org.glassfish.jersey.model.internal.CommonConfig.configureMetaProviders(CommonConfig.java:654) ~[jersey-common-2.23.2.jar:na]
    at org.glassfish.jersey.server.ResourceConfig.configureMetaProviders(ResourceConfig.java:829) ~[jersey-server-2.23.2.jar:na]
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:453) ~[jersey-server-2.23.2.jar:na]
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184) ~[jersey-server-2.23.2.jar:na]
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350) ~[jersey-server-2.23.2.jar:na]
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347) ~[jersey-server-2.23.2.jar:na]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jersey-common-2.23.2.jar:na]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[jersey-common-2.23.2.jar:na]
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) ~[jersey-common-2.23.2.jar:na]
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:347) ~[jersey-server-2.23.2.jar:na]
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:392) ~[jersey-container-servlet-core-2.23.2.jar:na]
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177) ~[jersey-container-servlet-core-2.23.2.jar:na]
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369) ~[jersey-container-servlet-core-2.23.2.jar:na]
    at javax.servlet.GenericServlet.init(GenericServlet.java:244) ~[javax.servlet-api-3.1.0.jar:3.1.0]
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:640) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    ... 21 common frames omitted

我通过将HK2升级到2.5.0-b22版本来解决这个问题。

最新更新