Spring Boot REST应用部署至WebLogic 10.3后REST资源无法访问求助
首先得明确,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

