Java Spring MVC在控制器之间传递数据

Java Spring MVC在控制器之间传递数据,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在使用SpringMVC编写web应用程序。在用户注销之前,我想在会话中保留一些数据。之前我是通过@SessionAttributes(“someData”)实现的,但后来我不得不将@modeldattribute(“someData”)someDataType someData作为每个请求映射方法的参数。这就是我所做的: 我的AccessData类: @Component @Scope(value = "session") public class AccessData { pr

我正在使用SpringMVC编写web应用程序。在用户注销之前,我想在会话中保留一些数据。之前我是通过
@SessionAttributes(“someData”)
实现的,但后来我不得不将
@modeldattribute(“someData”)someDataType someData
作为每个请求映射方法的参数。这就是我所做的:

我的AccessData类:

@Component
@Scope(value = "session")
public class AccessData {

    private long userID;

    private String userKey;

    public AccessData(long ID, String key) {
        this.userID = ID;
        this.userKey = key;
    }

    public long getUserID() {
        return userID;
    }

    public void setUserID(long userID) {
        this.userID = userID;
    }

    public String getUserKey() {
        return userKey;
    }

    public void setUserKey(String userKey) {
        this.userKey = userKey;
    }
}
第一个控制器(这里我从表单获取并验证用户输入):

第二控制器:

@Controller
@Scope(value = "session")
public class SecondController {

    @ModelAttribute("accessData")
    public AccessData getAccessData() {
        return this.accessData;
    }

    private Utils utilsService;

    private LoginService loginService;

    @Autowired
    private AccessData accessData;

    @Autowired
    public SecondController(LoginService loginService, Utils utils) {
        this.loginService = loginService;
        this.utilsService = utils;
    }

    @RequestMapping(value = ControllerPaths.SHOW_ACCESS_DATA, method =   RequestMethod.GET)
    public ModelAndView showAccessData(
        System.out.println(accessData.getUserKey());
        return utilsService.getShowView(ViewPaths.INDEX);
    }
}

问题是,当我在第二个控制器中打印userKey值时,该值为null。我在
LoginController
中检查了我是否从服务器获得了正确的数据,并且一切正常。那么我做错了什么?提前感谢您的帮助

问题在于您正在为accessData变量分配一个新对象。相反,您应该更新它已经引用的对象的字段

accessData = loginService.validateLoginData(loginData);

// Replace above line with something like this. Implement the copyProperties
// method to copy the attributes you need
AccessData newAccessData = loginService.validateLoginData(loginData);
copyPropteries(accessData,newAccessData);

另外,不需要将控制器会话范围设置为,将
proxyMode=TARGET\u CLASS
添加到
AccessData
类的范围注释中。

它可以工作,非常感谢!现在,有没有办法清除会话数据(当我使用ProxyMode时),比如session.setComplete()(它对我不起作用)?或者我应该实现清除accessData字段的方法吗?并没有自动的方法。您需要明确地清除字段。
accessData = loginService.validateLoginData(loginData);

// Replace above line with something like this. Implement the copyProperties
// method to copy the attributes you need
AccessData newAccessData = loginService.validateLoginData(loginData);
copyPropteries(accessData,newAccessData);