使用Java捕获文件时遇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

