2010-09-06 34 views
4

我跟隨在部分4.11 Weld's docCDI injectionpoint @httpparam問題

。該InjectionPoint對象

有一個關於如何使用CDI

獲得HTTP參數一個很有趣的例子,但我複製粘貼代碼到NetBeans,一切編譯,但有致的部署錯誤

:org.jboss.weld.exceptions.DeploymentException:WELD-001408注入點具有不滿足的依賴關係。注入點:java.lang.String的參數1 com.test.HttpParamProducer.getParamValue(javax.enterprise.inject.spi.InjectionPoint,javax.servlet.ServletRequest);限定符:[@ javax.enterprise.inject.Default()]

如何解決這個問題???

public class HttpParamProducer { 

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

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

    } 
} 
+0

這是一個非常酷的主意!你有沒有找到一個工作解決方案? – 2012-11-01 16:43:22

回答

0

看來,兩年後,這個問題仍有意

這是CDI規範,它不需要容器暴露HttpServletRequest的可注射豆

這裏是一個簡短的到來一個合理的解決辦法

@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(); 
    } 
} 

現在@Inject HttpServletRequest的將被按預期工作

快樂編碼

0

在生產者方法每個參數被注入,而且沒有你的豆類(包括生產商)提供的API類型的ServletRequest滿足該注入點。

+0

焊接用戶指南: CDI規範不要求servlet上下文對象,HttpServletRequest,HttpSession和ServletContext公開爲可注入bean。如果你真的希望能夠注入這些對象,很容易創建一個可移植擴展來將它們暴露爲beans .... – covener 2011-01-19 01:02:03

+1

你有沒有關於暴露HttpServletRequest的示例? – Dapeng 2011-01-19 04:22:29