2017-04-08 46 views
0

我是CDI的新手,我有一个难以解释的问题,但让我们试一试。我想有其产生的请求范围称为的RequestData喜欢这里的类的实例,例如(其伪代码)一个CDI制片人:CDI嵌套生产者问题

public class MyBean { 
    private RequestData dataHolder; 

    @Produces 
    @RequestScoped 
    public RequestData getData() { 
    return dataHolder; 
    } 
} 

我知道,这CDI厂家生产的一个实例,其“生命”在野蛮应用服务器中,只要请求上下文在那里(只要请求持续,我们称之为请求 - 单例实例thingy)

现在我想让那个RequestData类包含进一步的cdi生产者。就像这个例子(同样的Java伪代码):

public class RequestData { 
private Something1 param1; 
private Something2 param2; 
... 

@Produces 
public Something1 getParam1(){ 
    return param1; 
} 

@Produces 
public Something2 getParam2(){ 
    ... 
} 
} 

我的问题的最后一个问题是我怎么能强迫参数1和参数要从请求单个实例中为myBean生产(什么java代码/注释或者我需要什么)?

总结MyBean产生的RequestData和RequestData是活的整个请求时间,而且还会产生param1,param2。

这里一类注射参数1

public class Stuff{ 

@Inject 
public void startup(Something1 param1){ 
// param1 shall come from MyBean.getData().getParam1() 
} 
} 

任何想法的一些示例如何实现这一目标?如何让cdi引擎为param1执行MyBean.getData()。getParam1()?

回答

0

这是错误的方法。 CDI是一个非常强大的注入框架。你如何使用它来注射取决于你对它的理解程度。

对于这种情况下,更容易使用Instance懒注射如下:

@ApplicationScoped //No need to be request scope, CDI is quite smart 
public class RequestContextProvider { 

    @Inject 
    private HttpServletRequest servletRequest; 

    @Produces 
    @Dependent //Make dependent if it can be null, if you are sure it cannot be, just declare it as RequestScoped 
    public SomethingData createSomethingData(InjectionPoint ip) { 
     String requestParam = servletRequest.getParameter("something-data"); 
     if(requestParam == null) { 
      return null; 
     } 

     return initSomethingData(requestParam); 
    } 

} 

的使用将是这个样子:

@RequestScoped //Or whichever scope 
public class StuffService { 

    @Inject 
    private Instance<SomethingData> somethingData; 

    public void doStuff() { 
     //You need to take care here, that the somethingData.get() may return null 
     somethingData.get().soSomething(); 
    } 
} 
+0

你好,这是不是我要求的,但我喜欢。你能在我的要求下尝试解决我的问题吗? – Ckkn

+0

一,我不会解决你的问题,你想解决它的方式。为了生成param1和param2,我会像这样对'RequestData'产生依赖关系: '@''@Produces @RequestScoped public Something1 produce(RequestData rd) ''' – maress