我正在为使用struts2的大学班实施一个Web项目,当我运行该项目时,它会在containsKey()中阻塞。
它不打印任何字符串。
这是我遇到问题的一些代码:
package fundstarter.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.SessionAware;
import java.rmi.RemoteException;
import java.util.Map;
import fundstarter.model.ConnectToRMIBean;
public class LogInAction extends ActionSupport implements SessionAware {
private static final long serialVersionUID = 4L;
private Map<String, Object> session;
private String username = null;
private String password = null;
@Override
public String execute() throws RemoteException {
this.getConnectToRMIBean().setUsername(this.username);
this.getConnectToRMIBean().setPassword(this.password);
this.getConnectToRMIBean().logIn();
return "done";
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public ConnectToRMIBean getConnectToRMIBean() {
if(!session.containsKey("RMIBean")){
System.out.println("hello little trouble maker");
this.setConnectToRMIBean(new ConnectToRMIBean());
}
System.out.println("Hey snowball");
return (ConnectToRMIBean) session.get("RMIBean");
}
public void setConnectToRMIBean(ConnectToRMIBean RMIBean) {
System.out.println("I'm positive he's dead");
this.session.put("RMIBean", RMIBean);
}
@Override
public void setSession(Map<String, Object> arg0) {
// TODO Auto-generated method stub
}
}
我的代码与教授写的完全一样,我无法弄清楚我的代码有什么问题?
最佳答案
您应该得到一个NullPointerException
,因为您从未做过
this.session = /*...some object here...*/;
...在任何地方,因此
session
具有其默认值(null
)。因此,第一次调用getConnectToRMIBean
将尝试调用session.containsKey
并失败,因为您无法通过null
引用调用实例方法。由于您使用的是
SessionAware
,因此Struts会为您调用setSession
,但是您需要填写它,例如@Override
public void setSession(Map<String, Object> theSession) {
this.session = theSession;
}
添加一个构造函数并将初始化放入构造函数中,或仅将其作为初始化程序添加到声明行的末尾(因为这是您进行其他初始化的地方):
private Map<String, Object> session = new Map<String, ConnectToRMIBean>();