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

Spring Boot中Servlet独立端口注册及日志无输出问题排查

解决Spring Boot中自定义Servlet独立端口及日志不输出问题

先来解决最直观的日志不打印问题,再搞定多端口的配置:

一、为什么日志没输出?

大概率是你的ServletConfig没被Spring Boot正确加载,或者日志配置有问题:

1. 检查Spring组件扫描范围

Spring Boot主类的@SpringBootApplication默认只扫描主类所在包及其子包。如果你的ServletConfig在这个范围外,Spring不会加载这个配置类,自然不会执行里面的代码,日志也就打不出来。

  • 解决办法:要么把ServletConfig移到主类的包/子包下,要么在主类上加上@ComponentScan(basePackages = "com.your.servlet.package")(替换成你的Servlet配置类所在包路径)。

2. 检查日志配置

确保你已经正确配置了目标类的日志级别:
在application.properties里添加:

# 替换成你的ServletConfig和MyServlet所在的包路径
logging.level.com.yourpackage=INFO

如果用application.yml:

logging:
  level:
    com.yourpackage: INFO

另外,Spring Boot默认集成SLF4J+Logback,只要你没手动排除相关依赖,基础日志功能是正常的;如果自己替换了日志实现,要确保依赖引入正确。


二、让自定义Servlet跑在独立端口

Spring Boot默认只有一个Web服务器实例(比如Tomcat),只能绑定一个端口。要让Servlet和@RestController用不同端口,需要启动第二个Web服务器,专门处理你的Servlet请求:

1. 配置自定义端口

先在application.properties里添加自定义Servlet的端口:

# 默认RestController的端口(默认8080,可按需修改)
server.port=8080
# 自定义Servlet的独立端口
custom.servlet.port=8081

2. 创建第二个Web服务器配置

新建一个配置类,注册独立的ServletWebServerFactory,并把你的MyServlet绑定到这个服务器上:

@Configuration
public class CustomServletServerConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(CustomServletServerConfig.class);

    @Value("${custom.servlet.port}")
    private int customPort;

    @Bean
    public ServletWebServerFactory customServletServer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.setPort(customPort);
        // 把自定义Servlet注册到这个独立服务器
        factory.addServletRegistrations(servletRegistrationBean());
        LOGGER.info("自定义Servlet服务器启动,端口:{}", customPort);
        return factory;
    }

    private ServletRegistrationBean<MyServlet> servletRegistrationBean() {
        ServletRegistrationBean<MyServlet> bean = new ServletRegistrationBean<>(new MyServlet(), "/endpoint");
        bean.setLoadOnStartup(1);
        LOGGER.info("MyServlet已注册到自定义端口的服务器");
        return bean;
    }
}

注意:原来的ServletConfig可以删除了,因为我们把Servlet注册逻辑移到了这个新配置类里,专门绑定到第二个独立服务器。

3. 验证效果

启动应用后,你会看到两个服务器启动的日志:

  • 默认端口8080:处理你的@RestController接口请求
  • 自定义端口8081:处理/endpoint的POST请求(对应你的MyServlet)

三、额外注意点

  • 确保MyServlet的依赖类(AbstractXServlet、ServletHandlerr)逻辑正常:这些自定义类的初始化和请求处理逻辑如果有问题,即使Servlet注册成功也可能无法正常工作。
  • 如果用Jetty替代Tomcat,只需把TomcatServletWebServerFactory换成JettyServletWebServerFactory即可,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:12:36