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

WebLogic14.1.2+SpringBoot3.4.2+Java21部署后接口404求助

Spring Boot 3.4.2 + WebLogic 14.1.2 部署后接口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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:44:53