gpt4 book ai didi

java - 当我尝试在线程内访问静态方法时,它会抛出 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 11:18:36 24 4
gpt4 key购买 nike

这里我有一个线程

@Component("sessionStateListenerThread")
public class SessionStateListenerThread extends Thread {

private static final String DEFAULT_RESULT = "expired";
private List<DeferredResult<String>> subscribed = Collections
.synchronizedList(new ArrayList<DeferredResult<String>>());

/**
* Main thread loop for checking session state.
*/
@Override
public void run() {
while (true) {
synchronized (subscribed) {
try {
if (null == SecurityHelper.getUserLogin()) {
Iterator<DeferredResult<String>> it = subscribed.iterator();
while (it.hasNext()) {
DeferredResult<String> result = it.next();
result.setResult(DEFAULT_RESULT);
it.remove();
}
}
} catch (NullPointerException e) {
}
}
}
}

/**
* Adds client to listen session state.
*
* @param client
*/
public void addClient(DeferredResult<String> client) {
synchronized (subscribed) {
subscribed.add(client);
}
};
}

该类用于包装该线程

@Component
@DependsOn("sessionStateListenerThread")
public class SessionStateListener {

@Autowired
private SessionStateListenerThread thread;

@PostConstruct
public void configThread() {
thread.setDaemon(true);
thread.setName("SessionStateChecker");
}

/**
* Starts listener.
*/
public void startListener() {
thread.start();
}

/**
* Adds client to write result.
*
* @param client object to write result
*/
public void addSessionStateListener(DeferredResult<String> client) {
thread.addClient(client);
}
}

我将方法 startListener 放在 Controller 方法中。同样在 Controller 中,我访问方法 getUserLogin

String login = SecurityHelper.getUserLogin(); // successfully access it

listener.startListener();
线程中的

方法run也想访问此方法getUserLogin。但是,尽管 login 值不为 null - 调用 SecurityHelper.getUserLogin() 会在线程内抛出 NullPointerException

有什么问题吗? getUserLogin 看起来像这样

return SecurityContextHolder.getContext().getAuthentication().getName();

Stacktrace 有点小 (e.printstacktrace())

java.lang.NullPointerException
at com.ui.web.security.SecurityHelper.getUserLogin(SecurityHelper.java:45)
at com.ui.web.controller.rest.poll.SessionStateListenerThread.run(SessionState
ListenerThread.java:41)

最佳答案

这是因为您无法将当前 session 数据(上下文)获取到当前请求线程之外的单独线程中。

您将能够将任何 session 数据获取到任何 Controller 方法中,因为任何 Controller 方法都将在请求线程内执行。

关于java - 当我尝试在线程内访问静态方法时,它会抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31512058/

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