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

使用Java捕获文件时遇UnsatisfiedResolutionException问题求助

解决javaee-pac4j依赖引发的UnsatisfiedResolutionException问题

错误信息

javax.enterprise.inject.UnsatisfiedResolutionException: Api type [javax.servlet.http.HttpServletRequest] is not found with the qualifiers
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Method Injection Point, method name : getWebContext, Bean Owner : [WebContext, WebBeansType:PRODUCERMETHOD, Name:null, API Types:[java.lang.Object,org.pac4j.core.context.WebContext], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any], Producer Method: org.pac4j.core.context.WebContext org.pac4j.jee.util.Pac4jProducer.getWebContext(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]

问题根源:该错误由javaee-pac4j 7.1.0版本依赖引发,且因OIDC功能需求无法移除该依赖。

解决方案

  • 手动提供HttpServletRequest和HttpServletResponse的CDI生产者
    创建CDI生产者类,为HttpServletRequest和HttpServletResponse提供带默认限定符的实例,示例代码:

    import javax.enterprise.context.RequestScoped;
    import javax.enterprise.inject.Produces;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    
    @RequestScoped
    public class ServletRequestProducer {
    
        private static ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<>();
        private static ThreadLocal<HttpServletResponse> responseHolder = new ThreadLocal<>();
    
        @Produces
        @RequestScoped
        public HttpServletRequest getHttpServletRequest() {
            return requestHolder.get();
        }
    
        @Produces
        @RequestScoped
        public HttpServletResponse getHttpServletResponse() {
            return responseHolder.get();
        }
    
        @WebFilter(urlPatterns = "/*")
        public static class RequestCaptureFilter implements javax.servlet.Filter {
            @Override
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                try {
                    if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
                        requestHolder.set((HttpServletRequest) request);
                        responseHolder.set((HttpServletResponse) response);
                    }
                    chain.doFilter(request, response);
                } finally {
                    requestHolder.remove();
                    responseHolder.remove();
                }
            }
        }
    }
    

    该类通过过滤器捕获请求和响应存入ThreadLocal,再通过生产者方法暴露给CDI容器,满足Pac4jProducer的注入需求。

  • 检查容器兼容性
    确认当前Java EE容器(如WildFly、TomEE等)是否支持Servlet API的CDI注入,部分轻量容器需额外配置启用该支持。例如TomEE中需确保openejb.cdi.enable=true配置项已开启。

  • 调整javaee-pac4j版本
    尝试切换到javaee-pac4j的其他版本(如7.0.0或7.2.0),新版本可能修复了CDI注入的兼容性缺陷,同时保留OIDC功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:34:59