Spring Cloud Netflix Jersey版本冲突

5

你好,我有一个使用Spring Boot框架的应用程序

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>

这取决于Jersey 2.7版本。
在尝试使用时,需要确保:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

在内部使用Jersey 1.1版本的情况下,应用程序会因为同一库的两个不同版本而失败。

有什么建议可以解决这个问题吗?我尝试只使用版本2.7,但它们似乎不兼容彼此。

谢谢

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map; at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:303) at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:284) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:311) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:168) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117) at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:220) at io.undertow.servlet.core.ManagedServlet.getServlet(ManagedServlet.java:163) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:84) at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:82)


1
你是否尝试同时使用这两个依赖项? - Tim Biegeleisen
是的,我的整个项目都使用JAX-WS来实现服务,而Eureka的Spring Cloud客户端也在使用相同的技术,只不过版本较旧。 - user2818032
4个回答

3

我已经通过Spring Cloud指定了以下内容,成功地使用Jersey 2和Eureka客户端的设置:

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <excludes>
                <exclude>
                    <groupId>javax.ws.rs</groupId>
                    <artifactId>jsr311-api</artifactId>
                </exclude>
            </excludes>
        </configuration>
    </plugin>

唯一的问题是测试还没有运行。但我们仍在努力寻找完整的解决方案。


0

我之前也遇到了同样的问题,直到我将spring-boot-starter-jersey移到依赖列表的顶部,这似乎完全解决了它。


0

0

嗯,这不太好。Jersey 1和2有很大的区别。我认为你唯一的选择是删除spring-boot-starter-jersey并编写Jersey 1.1的代码。

值得一提的是,查看spring-boot-starter-jersey代码以了解它在自动配置方面提供的内容可能会对你的编码有所帮助。

这非常不幸,因为Spring Boot应该为您提供一个经过策划、兼容的依赖项集合,但看起来spring-cloud-starter-eureka还没有整合到Spring Boot中,所以您只能使用旧的API。


问题在于Eureka依赖于Jersey 1。这不是Spring Boot或其依赖管理的问题。 - spencergibb
是的,那似乎是唯一的解决方案,但我真的很喜欢最新版本的jersey的简单性,我有一个自定义安全过滤器。而且那些旧版本的jersey没有spring支持这个事实也是如此。 - user2818032
我尝试了Consul客户端,但它遇到了同样的问题,因为它使用了一些Netflix库。真是倒霉。我找到了一个使用Apache客户端库的Consul HTTP客户端,我会试试看,虽然它不太友好于Spring Cloud,但应该对Spring Boot友好,我想这应该足够了。 - user2818032

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接