将@RequestScoped Bean注入可运行类

问题描述 投票:0回答:1

我在将@RequestScoped Bean注入到Runnable类中时遇到问题。

这是我的资源类

@ApplicationScoped
@Path("/process")
public class TestResource {
    private static ExecutorService executor = Executors.newFixedThreadPool(20);

    @POST
    public void process(Integer id, @Suspended AsyncResponse ar) {
        TestRunnable testRunnable = new TestRunnable();
        testRunnable.setId(id);

        executor.execute(() -> {
            testRunnable.run();

            ar.resume("OK");
        });
    }

这是我的TestRunnable类:

public class TestRunnable implements Runnable {
    private Integer id;

    private ServiceBean serviceBean;

    public void asyncProcess() {
        serviceBean = CDI.current().select(ServiceBean.class).get();
        serviceBean.process(id);
    }

    @Override
    public void run() {
        asyncProcess();
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

当我尝试连接到端点时,出现以下错误?

WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped

我确定问题出在我的ServiceBean的错误注入...

java-ee cdi
1个回答
0
投票

我确定问题出在我的ServiceBean的错误注入上

不。问题恰好与异常消息中所说的一样:

No active contexts for scope type javax.enterprise.context.RequestScoped

根本没有可用的请求范围。

请求范围仅适用于在HTTP请求创建的原始线程中运行的代码。但是您基本上是在这里创建一个新线程,该线程与HTTP请求创建的原始线程完全独​​立(异步!)运行。

将所需数据作为构造函数参数传递。

TestRunnable testRunnable = new TestRunnable(serviceBean);
© www.soinside.com 2019 - 2024. All rights reserved.