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

Inject JNDI resources into a collection property of EJB

我有一个无状态 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); }
        ...
    }
}

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

不过,这段代码很丑,队列数应该是动态的。当我不得不增加队列数量时,我不想在多个地方更改代码,而是简单地添加一个配置 line/annotation.

有没有办法配置无状态bean,让资源直接注入List?我正在使用 EJB 3.0。

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

@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 完成代码。