我正在为使用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>();

09-30 17:27
查看更多