gpt4 book ai didi

java - 在 @serverEndpoint 类中注入(inject) EJB 会导致 NullPointerException

转载 作者:行者123 更新时间:2023-11-30 07:46:10 28 4
gpt4 key购买 nike

我正在使用 Swarm Wildfly 来部署此应用程序。基本上我正在制作一个支持 websocket 的应用程序。

我想注入(inject)一个单例,它将在启动时启动并修改变量结果。

访问“/rafflethis”链接后,用户将能够看到将通过 session 发送的结果。

结果是roll变量null

这就是类(class)

@Singleton
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class runMe implements RaffleManager{
private static final Logger LOGGER = Logger.getLogger(runMe.class.getName());

private static String result;

@PostConstruct
public void onStartup() {
System.out.println("Initialization success.");
}

@Schedule(second = "*/10", minute = "*", hour = "*", persistent = false)
public void run() throws Exception{
int i = 0;
while (true) {
Thread.sleep(1000L);
result = UUID.randomUUID().toString().toUpperCase();
i++;
LOGGER.log(Level.INFO, "i : " + i);
}
}

public String getResult() {
return result;
}
}

界面

public interface RaffleManager {
String getResult();
}

还有“/rafflethis”

@ServerEndpoint("/rafflethis")
public class RaffleThis implements Serializable {
@EJB
RaffleManager roll;

private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());

private static void sendMessageToAll(String message) {
for (Session s : sessions) {
try {
s.getBasicRemote().sendText(message);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

@OnOpen
public void monitorLuckyDip(Session session) throws Exception {
sessions.add(session);
while(true) {
sendMessageToAll(roll.getResult());
}
}
}

有什么线索我应该从哪里去?谢谢!

最佳答案

查看源代码,我可能会假设存在名称问题。您的单例 bean“runMe”是 bean 的实际名称,而不是接口(interface)。

旁注:类名的最佳做法是将第一个字母大写。 RunMe 而不是 runMe。

@Singleton - 不带参数将自动命名您的 bean,以便使用类名称中的 bean 约定进行查找。想象一下,如果您实现多个接口(interface),EJB 如何选择名称?所以使用类名是合乎逻辑的。例如。如果您的类名为 TestMe,则 ejb 名称将为 testMe。

在你的例子中,由于你的类名是 runMe,我认为 bean 名称将是 runMe。

为了确保查找不会失败,您可以在@Singleton和@EJB中指定名称。

@Singleton(name = "runMe")
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class runMe implements RaffleManager{

然后在您的服务端点类中

@ServerEndpoint("/rafflethis")
public class RaffleThis implements Serializable {
@EJB(beanName ="runMe")
RaffleManager roll;

关于java - 在 @serverEndpoint 类中注入(inject) EJB 会导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33930572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com