将JNDI资源注入EJB的集合属性

时间:2015-07-03 13:35:02

标签: dependency-injection resources ejb jndi

我有一个无状态EJB,它包含多个应该注入的JNDI资源:

@Stateless(name = "QueueDispatcher")
public class QueueDispatcher {  
    @Resource(name = "jms/syncQueue1")
    private Queue queue1;    
    @Resource(name = "jms/syncQueue2")
    private Queue queue2;
    ...

    private List<Queue> queueList;  

    @PostConstruct
    public void init() {
        //Move injected queues into arraylist...
        queueList = new ArrayList<Queue>();
        if(queue1 != null){ queueList.add(queue1); }
        if(queue2 != null){ queueList.add(queue2); }
        ...
    }
}

我当前的实现使用多个字段来接收注入的资源,然后将它们移动到Collection中供以后使用。

但是,这段代码很难看,队列的数量应该是动态的。当我必须增加队列数量时,我不想在多个地方更改代码,而只需添加一个配置行/注释。

是否有办法配置无状态bean,以便将资源直接注入List?我正在使用EJB 3.0。

1 个答案:

答案 0 :(得分:1)

@Resource无法绑定到列表,但您可以使用包含jms/syncQueue2,jms/syncQueue2等所有资源的字符串列表,然后在@PostCostruct中进行动态查找。< / p>

@Resource(name = "myqueues")
private String queues;

...

@PostConstruct
public void init() {
    Context ctx=new InitialContext();
    String[] list = queues.split(",");
    for(String item : list) {
        try { 
            Queue q = (Queue) ctx.lookup(item);
            queueList.add(q);
        }
    }
}

使用catch ecc完成代码。