홈>
저지 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
관련 질문
- java - ControllerAdvice, ExceptionHandler 및 RestController에서 catch 블록 시도
- java - Spring RESTful 웹 서비스 문제
- java - 봄 부팅에서 JSON을 구문 분석 할 수 없습니다
- java - 웹 서버가 봄 부팅에서 HTTP를 노출하기 전에 코드가 실행되는지 확인하십시오
- java - 서비스 계층에서 유효성 검사가 발생할 때 웹 계층 테스트 - 스프링 부트 테스트
- java/spring boot를 사용하는 클라우드 네이티브 빌드 팩/paketo - 다른 jdk 다운로드 uri를 구성하는 방법 (예 : githubcom에 대한 액세스 권한 없음)
- java - SpringBoot 리소스를 UTF-8 파일로 엽니 다
- java - JUnit 테스트는 하나씩 실행할 때만 통과합니다 아마도 잘못된 스레딩
- spring - Java에서 주석 번들을 생성 할 수 있습니까 (즉, 다른 주석을 적용하는 주석)?
- java - Spring에서 Keycloak 토큰을 얻는 방법
실제로 Spark 2.0은 Jersey 2.x와 함께 제공됩니다
저지 스프링이 저지 1.x를 가져올 때, 둘 다 공통 클래스가 있지만 구현 방식이 다릅니다.
이제 오류를 보자
따라서
UriBuilder
에 대한 추상 메소드가 발생했다고 말합니다. 예. 일반적으로 Java 컴파일러는 추상 클래스가있는 인스턴스를 작성할 수 없습니다 (추상 메소드 사용). 따라서 컴파일 타임과 런타임에 사용되는 클래스가 다르다는 것을 분명히 결론 지을 수 있습니다. 런타임에 클래스가 어떻게 변경되는지 살펴보고javax.ws.rs.core.UriBuilder.fromUri
의 소스 코드를 살펴보십시오. 메소드 추적 :필요한
다음을 사용하여 해결되는 방법 :
RuntimeDelegate.findDelegate()
를 부르고있다 는 RuntimeDelegate의 구현을 작성하며, 이는UriBuilder
를 작성하는 데 사용됩니다. . 런타임에 클래스 경로 불일치로 인해com.sun.jersey.api.uri.UriBuilderImpl
를 해결합니다. (저지 1에서), 추상 메소드public abstract UriBuilder uri(String uriTemplate);
에 대한 구현이 없습니다. (2.0에서 도입되었으므로). 내가 방금했던 것을 피하기 위해차례로
org.glassfish.jersey.uri.internal.JerseyUriBuilder
에 대한 적절한 구현을 만듭니다. (비 추상 클래스). 실제로cachedDelegate
라는 정적 멤버를 설정합니다. 와이즈 비즈 .단순히 URI 확인이므로 다른 라이브러리가 작동 할 수 있습니다. 해당 클래스는 저지 1 및 저지 2와 완벽하게 호환됩니다. 누군가 다른 라이브러리를 찾으면 알려주십시오.
RuntimeDelegate