00 版本说明
组件 | 版本 |
---|---|
WebLogic | 12.2.1.3 |
Spring Boot | 2.1.6.RELEASE |
spring-cloud-netflix-eureka-server | 2.1.2.RELEASE |
01 现象
使用eureka server作为注册中心,以war包形式部署到weblogic中时,无论是否配置优先加载项目类库,都会出现项目无法启动的情况。如果使用prefer-application-packages配置优先的包,项目虽然可以启动,但是会出现其他服务无法注册的问题,日志中会报出如下异常:
ERROR [ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)' --- [forwardToErrorPage] o.s.b.w.s.support.ErrorPageFilter : Forwarding to error page from request [/eureka/peerreplication/batch/] due to exception [javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;]
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 com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:911)
at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:875)
at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:829)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
02 分析&解决
从异常信息中可以看到,是程序在调用javax.ws.rs.core.UriBuilder.uri(String)
这个方法时出现问题的,问题原因是该方法是一个抽象方法。
根据异常堆栈信息,首先找到com.sun.jersey.spi.container.servlet.ServletContainer
的911行,该类位于jersey-servlet-1.19.1.jar中
final UriBuilder absoluteUriBuilder = UriBuilder.fromUri(request.getRequestURL().toString());
在进一步跟踪UriBuilder.fromUri(String)的位置,javax.ws.rs.core.UriBuilder
在jsr311-api-1.1.1.jar中
public static UriBuilder fromUri(String uri) throws IllegalArgumentException {
URI u;
try {