WebLogic14.1.2+SpringBoot3.4.2+Java21部署后接口404求助
环境与问题概述
使用WebLogic 14.1.2、Spring Boot 3.4.2、Java 21开发应用,已解决部署阶段的java.lang.ClassNotFoundException: jakarta.servlet.jsp.tagext.DynamicAttributes错误,但访问接口http://localhost:7001/demoWebLogic/something/test时出现404,静态页面http://localhost:7001/demoWebLogic/可正常访问,说明应用部署成功但Spring MVC接口未正确映射。
已做操作:
- 添加
servlet-api、jsp-api依赖并排除spring-boot-starter-web中的servlet-api - 尝试引入
jakarta.jakartaee-api依赖管理,未解决问题
控制器代码:
import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/something") public class Controller { @GetMapping(path = "/test", produces = "application/json;charset=UTF-8") public ResponseEntity<String> test() { return new ResponseEntity<>("Hello World", HttpStatus.OK); } }
排查与解决方案
1. 配置SpringBootServletInitializer实现外部容器初始化
Spring Boot部署到WebLogic这类外部Java EE容器时,需要通过SpringBootServletInitializer让容器识别并初始化Spring上下文。检查启动类是否继承该类并实现configure方法:
@SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
缺失该配置会导致Spring的DispatcherServlet无法被容器加载,接口无法映射。
2. 修正依赖Scope与排除Tomcat依赖
WebLogic自身已提供Servlet、JSP等Java EE API,需将相关依赖的scope设为provided,避免打包时冲突;同时需排除spring-boot-starter-web中的Tomcat依赖,防止与WebLogic容器冲突:
<packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> <exclusion> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.1.1</version> <scope>provided</scope> </dependency> </dependencies>
移除之前添加的jakarta.jakartaee-api依赖,WebLogic 14.1.2原生支持Jakarta EE 9,额外引入会导致版本冲突。
3. 确认WebLogic部署上下文路径
- 检查部署的war包名称是否为
demoWebLogic.war,WebLogic默认以war包名作为上下文根; - 登录WebLogic控制台,查看应用的**上下文根(Context Root)**配置是否为
/demoWebLogic,若不一致需调整访问路径或修改配置。
4. 验证Spring容器与接口映射日志
查看WebLogic的服务器日志,确认:
- 是否有
Mapping servlet: 'dispatcherServlet' to [/]日志,说明DispatcherServlet已初始化; - 是否有
Mapped "{[/something/test],methods=[GET]}"日志,说明控制器接口已成功映射。
若缺失上述日志,需检查: - 启动类的
@SpringBootApplication是否覆盖了控制器所在的包,若控制器不在启动类同包/子包下,需添加scanBasePackages指定扫描路径:
@SpringBootApplication(scanBasePackages = "com.your.controller.package") public class DemoApplication extends SpringBootServletInitializer { // ... }
5. 清理并重新部署
清理WebLogic的临时部署目录(domain_home/servers/server_name/tmp),重新打包war包并部署,避免缓存导致的问题。
内容的提问来源于stack exchange,提问作者LeoNicola

