You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot REST应用部署至WebLogic 10.3后REST资源无法访问求助

解决Spring Boot REST应用部署到WebLogic 10.3时REST资源404的问题

首先得明确,WebLogic 10.3是个比较老的版本(基于Java EE 5、Servlet 2.5规范),和Spring Boot默认的Servlet 3.0+适配逻辑不兼容,这就是为啥静态页面能访问(WebLogic能正常识别webapp下的静态资源),但REST端点返回404的核心原因——Spring的DispatcherServlet没被正确注册到WebLogic中。

下面是一步步的解决方案:

1. 显式注册DispatcherServlet,适配Servlet 2.5规范

WebLogic 10.3不支持Servlet 3.0的注解式Servlet自动注册,所以我们得通过代码显式把Spring的DispatcherServlet注册进去。创建一个自定义的SpringBootServletInitializer子类:

public class CustomServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(YourSpringBootApplication.class);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        // 手动创建并注册DispatcherServlet
        WebApplicationContext context = createWebAppContext();
        ServletRegistration.Dynamic dispatcherServlet = servletContext.addServlet("springDispatcherServlet", new DispatcherServlet(context));
        dispatcherServlet.setLoadOnStartup(1);
        // 这里的映射路径要和你的REST端点前缀匹配,比如所有/api开头的请求都交给Spring处理
        dispatcherServlet.addMapping("/api/*");
        // 如果你的REST端点是根路径,就用"/*",但注意别覆盖静态资源的访问
    }

    private WebApplicationContext createWebAppContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(YourSpringBootApplication.class);
        return context;
    }
}

2. 完善weblogic.xml配置,解决类加载冲突

WebLogic 10.3自带了一些老旧的类库(比如旧版本的Spring、Jackson),很容易和你的应用依赖冲突。调整你的weblogic.xml,让WebLogic优先加载应用自身的类:

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd">
    <!-- 核心设置:优先加载WEB-INF下的类,避免和WebLogic内置类冲突 -->
    <wls:container-descriptor>
        <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
        <!-- 额外指定优先加载的包,进一步避免冲突 -->
        <wls:prefer-application-packages>
            <wls:package-name>org.springframework.*</wls:package-name>
            <wls:package-name>com.fasterxml.jackson.*</wls:package-name>
        </wls:prefer-application-packages>
    </wls:container-descriptor>
    <!-- 设置应用的上下文根,确保访问路径正确 -->
    <wls:context-root>/your-app-context</wls:context-root>
</wls:weblogic-web-app>

3. 调整Spring Boot依赖,排除Servlet API冲突

WebLogic 10.3自带Servlet 2.5的API,所以要排除Spring Boot starter-web中自带的Servlet API依赖,避免版本冲突:

<!-- Maven示例 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4. 验证访问路径是否正确

最后别忘了检查你的REST端点访问路径:
比如你的控制器是这样的:

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping
    public List<User> listUsers() {
        // ...业务逻辑
    }
}

那么正确的访问路径应该是:http://your-weblogic-host:port/your-app-context/api/users,别漏掉weblogic.xml中设置的上下文根。

按照上面的步骤调整后,WebLogic 10.3就能正确识别并转发REST请求到Spring的DispatcherServlet了,404问题应该就能解决。

内容的提问来源于stack exchange,提问作者osama yaccoub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:03:11