Jersey 2.6 REST服务升级到Java 8 tomcat 8异常:Java.lang.NoSuchMethodError:javax.validation.Configuration.getBootstrapConfiguration

Jersey 2.6 REST服务升级到Java 8 tomcat 8异常:Java.lang.NoSuchMethodError:javax.validation.Configuration.getBootstrapConfiguration,validation,jersey,java-8,jersey-2.0,hk2,Validation,Jersey,Java 8,Jersey 2.0,Hk2,我们在jersey 2.6上公开了rest服务,并基于hibernate-4.2.7验证(实现了validation-api-1.0.0.GA)进行了验证 在升级到java 8和tc server 3.1.X之前,一切正常。 升级到java 8后,验证api中似乎出现了问题。 我们得到 java.lang.NoSuchMethodError:javax.validation.Configuration.getBootstrapConfiguration()Ljavax/validation/Bo

我们在jersey 2.6上公开了rest服务,并基于hibernate-4.2.7验证(实现了validation-api-1.0.0.GA)进行了验证

在升级到java 8和tc server 3.1.X之前,一切正常。
升级到java 8后,验证api中似乎出现了问题。
我们得到

java.lang.NoSuchMethodError:javax.validation.Configuration.getBootstrapConfiguration()Ljavax/validation/BootstrapConfiguration

当我们从客户端发送rest请求时。
最奇怪的是,这种行为并不存在
当我从依赖项中添加或删除JAR时,它有时有效,有时无效

我们得到以下例外

SEVERE [tomcat-http--1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jerseyServlet] in context with path [/Analyzer] threw exception [A MultiException has 1 exceptions.  They are:
1. java.lang.NoSuchMethodError: javax.validation.Configuration.getBootstrapConfiguration()Ljavax/validation/BootstrapConfiguration;
] with root cause
 java.lang.NoSuchMethodError: javax.validation.Configuration.getBootstrapConfiguration()Ljavax/validation/BootstrapConfiguration;
    at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.getTraversableResolver(ValidationBinder.java:287)
    at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.getDefaultValidatorContext(ValidationBinder.java:268)
    at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.getDefaultValidator(ValidationBinder.java:248)
    at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.provide(ValidationBinder.java:199)
    at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.provide(ValidationBinder.java:173)
    at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:96)
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:456)
    at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:69)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2445)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:621)
    at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:107)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:135)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:136)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:406)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:350)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:259)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    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.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:319)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at SourceResolverFilter.doFilter(SourceResolverFilter.java:71)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:277)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
查看堆栈跟踪,您可以看到
jersey
正在调用
配置.getbootstrapcConfiguration
,该配置在validation-api-1.1.0.Final中提供,但在validation-api-1.0.0.GA中未提供

你知道为什么有时候jersey via hk2坚持调用validation-api-1.1.0-Final方法,有时候调用1.0.0.GA吗。 我知道验证是在泽西岛自动发现的,有没有办法强迫它使用validation-api-1.0.0.GA实现

另外,我注意到bean-validation-2.2.0有一个javax.validation.*来自validation-api-1.1.0.Final(为什么?)的包的副本,但正如您从依赖关系树中看到的,我们明确排除了它

更新: 深入研究代码,它看起来像jersey bean validation:2.6实际上是根据validation-api-1.1.0.Final编译的,并且静态地调用 getBootstrapConfiguration()方法。实际上,在mvnrepository.com依赖项中,它可以追溯到jersey bean验证:2.0版本深化到validation-api-1.1.0.Final

查看org.glassfish.jersey.server.validation.internal.ValidationBinder类 您可以看到
private-ConfiguredValidator getDefaultValidator()
方法调用
getBootstrapConfiguration()
;调用私有方法时
getTraversableResolver()

因此,它看起来像是唯一的选项,不知何故,在提供方法中,我有一个
ContextResolver
,它会导致代码在不同路径上分支,从而使调用无效
getbootstrapcConfiguration

public ConfiguredValidator provide() {
    ContextResolver contextResolver = this.providers.getContextResolver(ValidationConfig.class, MediaType.WILDCARD_TYPE);
    if(contextResolver == null) {
        return this.getDefaultValidator();
    } else {
 //not calling the getBootstrapConfiguration()  method
}
我调试了两个案例,一个有效,一个无效。 当服务运行时,我注意到ValidationBinder正在注入
org.hibernate.validator.internal.engine.ConfigurationImpl.class
到配置字段 此实现来自bean-validation-2.2.0 jar,并实现getBootstrapConfiguration()方法 当服务不起作用时,ValidationBinder正在注入
org.hibernate.validator.engine.configurationmpl
到配置字段 它来自hibernate-validation-4.2.0jar

我试图通过将配置绑定到org.hibernate.validator.internal.engine.configurationmpl.class来强制设置 e、 g


但这并没有解决我的问题。

经过我的调查,我在这里没有得到任何答案(尽管我建议悬赏),而不是在泽西论坛。 我们可以假设,我只是幸运地在Java7(所有时间)和Java8(部分时间)中实现了这一功能,可能有一些bug/神奇的类路径顺序

对我来说,成功的是升级到hibernate validator 5.0.0和validator-api-1.1.0。最终版。

据我所知,jersey 2.6似乎是支持java 6的jersey的最后一个版本。更新jersey版本也应该可以

我将我的jersey版本更新为
2.26
,(当时的最新版本),并向maven添加了以下依赖项…然后一切都很好

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.27</version>
</dependency>

javax.xml.bind
jaxb api
2.3.0
javax.activation
激活
1.1
org.glassfish.jersey.inject
泽西-hk2
2.27

更新hibernate-validator-4.3.2导致java.lang.NoSuchMethodError:javax.validation.Configuration.GetParameterNames异常
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(org.hibernate.validator.internal.engine.ConfigurationImpl.class).to(Configuration.class);
    }
});
}
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.27</version>
</dependency>