>

저지 2 + 스프링을 사용하여 편안한 서비스를 개발하고 있습니다. 같은 프로젝트에서 Spark 2.0.11에 의존합니다. 그러나 프로젝트에 스파크 종속성을 추가하면 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>

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>

나는 문제가 UriBuilder 클래스의 충돌 정의라는 것을 알고 있습니다 (많은 포함 된 라이브러리에 있습니다). 그래서 어떤 제안.


  • 답변 # 1

    실제로 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의 구현을 작성하며, 이는 UriBuilder 를 작성하는 데 사용됩니다. . 런타임에 클래스 경로 불일치로 인해 com.sun.jersey.api.uri.UriBuilderImpl 를 해결합니다.  (저지 1에서), 추상 메소드 public abstract UriBuilder uri(String uriTemplate); 에 대한 구현이 없습니다.  (2.0에서 도입되었으므로). 내가 방금했던 것을 피하기 위해

       RuntimeDelegate.setInstance(new org.glassfish.jersey.internal.RuntimeDelegateImpl());
    
    
    응용 프로그램 시작시

    차례로 org.glassfish.jersey.uri.internal.JerseyUriBuilder 에 대한 적절한 구현을 만듭니다.  (비 추상 클래스). 실제로 cachedDelegate 라는 정적 멤버를 설정합니다.  와이즈 비즈 .

    단순히 URI 확인이므로 다른 라이브러리가 작동 할 수 있습니다. 해당 클래스는 저지 1 및 저지 2와 완벽하게 호환됩니다. 누군가 다른 라이브러리를 찾으면 알려주십시오.

    RuntimeDelegate

  • 이전 r - 연간 볼륨에 대한 막대 그래프는 일년 내내 표시되지 않습니다
  • 다음 java - android alarmmanger에서 setrepeating () 문제가 있습니까?