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

Spring Boot 3.x集成基于javax.servlet的Hessian Servlet方法咨询

解决Spring Boot 3集成基于javax.servlet的HessianServlet问题

你遇到的核心矛盾是javax.servlet与jakarta.servlet的API包隔离:旧版HessianServlet继承自Java EE的javax.servlet.Servlet,但Spring Boot 3要求注册的Servlet必须实现Jakarta EE的jakarta.servlet.Servlet,直接继承会因方法签名(同名但分属不同API)重复定义导致编译失败。以下是两种可行解决方案:


方案一:适配器模式(无依赖升级)

通过委托而非继承的方式,编写适配类实现jakarta.servlet.Servlet,内部持有旧版HessianServlet实例,将请求完全委托给它处理,彻底规避API冲突。

1. 编写Hessian Servlet适配器

import com.caucho.hessian.server.HessianServlet;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HessianJakartaServletAdapter implements Servlet {

    // 内部维护旧版HessianServlet实例
    private final HessianServlet hessianServlet = new HessianServlet();

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        try {
            // 手动注入Hessian所需的初始化参数
            hessianServlet.setHomeClass(Class.forName(servletConfig.getInitParameter("home-class")));
            hessianServlet.setHomeAPI(Class.forName(servletConfig.getInitParameter("home-api")));
            // 调用HessianServlet的无参init完成内部初始化
            hessianServlet.init();
        } catch (ClassNotFoundException e) {
            throw new ServletException("Hessian服务初始化失败", e);
        }
    }

    @Override
    public ServletConfig getServletConfig() {
        return null; // 按需返回,或编写适配类转换Jakarta到javax的ServletConfig
    }

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // 将Jakarta请求/响应委托给旧版HessianServlet处理
        hessianServlet.service((HttpServletRequest) request, (HttpServletResponse) response);
    }

    @Override
    public String getServletInfo() {
        return hessianServlet.getServletInfo();
    }

    @Override
    public void destroy() {
        hessianServlet.destroy();
    }
}

2. 在Spring Boot中注册适配器

通过ServletRegistrationBean注册适配器,配置原有的初始化参数和URL映射:

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HessianServletConfig {

    @Bean
    public ServletRegistrationBean<HessianJakartaServletAdapter> hessianServletRegistration() {
        ServletRegistrationBean<HessianJakartaServletAdapter> registrationBean = new ServletRegistrationBean<>(
                new HessianJakartaServletAdapter(), "/myhessian/*");
        
        // 配置原web.xml中的初始化参数
        registrationBean.addInitParameter("home-class", "com.api.HessianServiceImpl");
        registrationBean.addInitParameter("home-api", "com.api.ServicePort");
        
        registrationBean.setName("HessianServlet");
        return registrationBean;
    }
}

方案二:升级Hessian到Jakarta兼容版本

如果允许升级依赖,Caucho官方从Hessian 5.0版本开始提供了Jakarta Servlet API适配类com.caucho.hessian.server.JakartaHessianServlet,可直接替换旧版类进行注册:

import com.caucho.hessian.server.JakartaHessianServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HessianServletConfig {

    @Bean
    public ServletRegistrationBean<JakartaHessianServlet> hessianServletRegistration() {
        JakartaHessianServlet servlet = new JakartaHessianServlet();
        ServletRegistrationBean<JakartaHessianServlet> registrationBean = new ServletRegistrationBean<>(
                servlet, "/myhessian/*");
        
        registrationBean.addInitParameter("home-class", "com.api.HessianServiceImpl");
        registrationBean.addInitParameter("home-api", "com.api.ServicePort");
        registrationBean.setName("HessianServlet");
        
        return registrationBean;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:52:49