泽西岛+;Spark javax.ws.rs.core.UriBuilder.uri

泽西岛+;Spark javax.ws.rs.core.UriBuilder.uri,java,spring,rest,apache-spark,jersey-2.0,Java,Spring,Rest,Apache Spark,Jersey 2.0,我正在使用Jersey 2+spring开发一个Restful服务。在同一个项目中,我依赖Spark 2.0.11。但一旦将spark依赖项添加到项目中,调用Restful服务时就会抛出以下异常。例外情况: SEVERE: Servlet.service() for servlet [jersey-serlvet] in context with path [/recommender] threw exception [Servlet execution threw an exception]

我正在使用Jersey 2+spring开发一个Restful服务。在同一个项目中,我依赖Spark 2.0.11。但一旦将spark依赖项添加到项目中,调用Restful服务时就会抛出以下异常。例外情况:

SEVERE: Servlet.service() for servlet [jersey-serlvet] in context with path [/recommender] threw exception [Servlet execution threw an exception] with root cause
java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:298)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:958)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
pom.xml:

<properties>
    <org.springframework-version>4.0.0.RELEASE</org.springframework-version>
    <jersey2.version>2.19</jersey2.version>
    <jaxrs.version>2.0.1</jaxrs.version>
  </properties>
<dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-mllib_2.10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.11</artifactId>
        <version>2.0.0</version>
    </dependency>

  <!-- JAX-RS -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>${jaxrs.version}</version>
        </dependency>
        <!-- Jersey 2.19 -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey2.version}</version>
        </dependency>
    <dependency>
      <groupId>io.swagger</groupId>
      <artifactId>swagger-jersey-jaxrs</artifactId>
      <version>1.5.0</version>
      <!-- <exclusions>
        <exclusion>
            <artifactId>jersey-multipart</artifactId>
            <groupId>com.sun.jersey.contribs</groupId>
        </exclusion>
      </exclusions> -->
    </dependency>

    <!-- spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>



    <!-- jersey + spring -->
    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-spring</artifactId>
        <version>1.9</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-asm</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

4.0.0.0发布
2.19
2.0.1
org.apache.spark
spark-core_2.11
2.0.0
org.apache.spark
spark-mllib_2.11
2.0.0
javax.ws.rs
javax.ws.rs-api
${jaxrs.version}
org.glassfish.jersey.containers
jersey容器servlet
${jersey2.version}
org.glassfish.jersey.core
泽西服务器
${jersey2.version}
org.glassfish.jersey.core
泽西岛客户
${jersey2.version}
昂首阔步
昂首阔步
1.5.0
org.springframework
弹簧芯
${org.springframework版本}
org.springframework
spring上下文
${org.springframework版本}
org.springframework
弹簧网
${org.springframework版本}
com.sun.jersey.contribs
泽西之春
1.9
org.springframework
春天
org.springframework
弹簧芯
org.springframework
弹簧网
org.springframework
春豆
org.springframework
spring上下文
org.springframework
春季asm
web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5">
    <display-name>WebApp</display-name>

    <!-- <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param> -->

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
             <param-name>jersey.config.server.provider.packages</param-name>
             <param-value>com.company.recommender.rest.v1</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>Jersey2Config</servlet-name>
        <servlet-class>io.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.0.0</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>http://localhost:8085/recommender/rest/v1</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/v1/*</url-pattern>
    </servlet-mapping> 

</web-app>

网络应用
org.springframework.web.context.ContextLoaderListener
泽西塞尔维特酒店
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.company.recommender.rest.v1
1.
运动衫2配置
io.swagger.jaxrs.config.defaultjaxrconfig
api.0版本
1.0.0
swagger.api.basepath
http://localhost:8085/recommender/rest/v1
2.
泽西塞尔维特酒店
/休息/v1/*

我知道问题在于UriBuilder类的冲突定义(它可以在许多附带的库中找到)。因此,任何建议

实际上,Spark 2.0带来了jersey 2.x和

[INFO] |  +- org.glassfish.jersey.core:jersey-client:jar:2.22.2:compile
[INFO] |  |  +- javax.ws.rs:javax.ws.rs-api:jar:2.0.1:compile
泽西之春推出泽西1.x版, 两者都有一些共同的类,但实现是不同的

现在,让我们看看错误

java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
所以它说它遇到了
UriBuilder
实例的抽象方法。一般来说,Java编译器不允许使用抽象类(具有抽象方法)创建实例。因此,您可以清楚地得出结论,编译时和运行时使用的类是不同的。让我们看看类在运行时是如何更改的,看看
javax.ws.rs.core.UriBuilder.fromUri
方法跟踪的源代码:

public static UriBuilder fromUri(URI uri) {
    return newInstance().uri(uri);
}
这需要

protected static UriBuilder newInstance() {
        return RuntimeDelegate.getInstance().createUriBuilder();
}
使用以下方法解决此问题:

public static RuntimeDelegate getInstance() {

        RuntimeDelegate result = cachedDelegate;
        if (result == null) { // First check (no locking)
            synchronized (RD_LOCK) {
                result = cachedDelegate;
                if (result == null) { // Second check (with locking)
                    cachedDelegate = result = findDelegate();
                }
            }
        }
        return result;
    }
它正在调用
RuntimeDelegate.findDelegate()
,这将创建RuntimeDelegate的实现,而RuntimeDelegate又将用于创建
UriBuilder
。由于运行时类路径不匹配,它正在解析为
com.sun.jersey.api.uri.UriBuilderImpl
(来自jersey 1),它没有抽象方法
公共抽象UribuilderURI(字符串uriTemplate)的实现(因为它是从2.0引入的)。为了避免这一点,我只是这么做了

    RuntimeDelegate.setInstance(new org.glassfish.jersey.internal.RuntimeDelegateImpl());
在应用程序开始时。从而为
org.glassfish.jersey.uri.internal.JerseyUriBuilder
(非抽象类)创建适当的实现。它实际上在
RuntimeDelegate
中设置名为
cachedDelegate
的静态成员


由于这只是URI解析,不同的库可能会起作用。给定的类与jersey 1和jersey 2完全兼容。如果有人找到其他的LIB,请告诉我。

很高兴听到这也对我有用!