开发者

CDI injectionpoint @httpparam problem

开发者 https://www.devze.com 2023-01-15 03:21 出处:网络
I follow the Weld\'s doc in the section 4.11. The InjectionPoint object There is a very interesting example about how to obtain the http parameter using CDI开发者_Go百科

I follow the Weld's doc

in the section 4.11. The InjectionPoint object

There is a very interesting example about how to obtain the http parameter using CDI开发者_Go百科

but i copy-pasted the code into netbeans, everything compiles, but has an deployment error

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Injection point has unsatisfied dependencies. Injection point: parameter 1 of java.lang.String com.test.HttpParamProducer.getParamValue(javax.enterprise.inject.spi.InjectionPoint,javax.servlet.ServletRequest); Qualifiers: [@javax.enterprise.inject.Default()]

how to solve this problem???

public class HttpParamProducer {

   @HttpParam("")
   @Produces
   String getParamValue(
           InjectionPoint ip, ServletRequest request) {

      return request.getParameter(ip.getAnnotated().getAnnotation(HttpParam.class).value());

   }
}


Every parameter on a producer method is injected, and none of your beans (including producers) provides the API type ServletRequest to satisfy this injection point.


it seems that after two years, this question is still interested

this is a short coming of the CDI spec, where it doesn't require the container to expose HttpServletRequest as injectable bean

here is a reasonable work around

@WebListener 
public class HttpServletRequestProducer implements ServletRequestListener {
    private final static ThreadLocal<HttpServletRequest> holder = new ThreadLocal<HttpServletRequest>();

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        holder.remove();
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        holder.set((HttpServletRequest)sre.getServletRequest());
    }

    @Produces @RequestScoped HttpServletRequest get() {
        return holder.get();
    }
}

now @Inject HttpServletRequest will be working as expected

happy coding

0

精彩评论

暂无评论...
验证码 换一张
取 消