JdbcOperationsSessionRepository.jdbcSession不可见

时间:2018-01-24 15:02:01

标签: java spring html5 spring-mvc spring-session

我的程序正在使用Spring Session基于xml的配置,我使用JdbcOperationsSessionRepository来实现我的会话。 JdbcOperationsSessionRepository库正在使用JdbcOperationsSessionRepository.JdbcSession,如何设置会话属性?

package sessioncontrol.page;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.session.Session;
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
import org.springframework.session.jdbc.JdbcOperationsSessionRepository.JdbcSession;
import org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import lombok.extern.log4j.Log4j2;

@Log4j2
@Controller
@EnableJdbcHttpSession
public class SessionControl {
    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    PlatformTransactionManager transactionManager;

    private JdbcOperationsSessionRepository repository;

    @RequestMapping(value="flpage", method=RequestMethod.GET)
    public String showPage(Model model) {
        repository = new JdbcOperationsSessionRepository(jdbcTemplate, transactionManager);
        repository.setTableName("test.spring_session");
        repository.setDefaultMaxInactiveInterval(120);
        JdbcSession session = repository.createSession();
        session.setAttribute("ATTR_USER", "rwinch");
        repository.save(session);

        return "flpage";
    }
}

它告诉我导入org.springframework.session.jdbc.JdbcOperationsSessionRepository.JdbcSession; 不可见所以如何才能正确使用内部类集属性方法?我真的卡在这里。

在此先感谢,任何评论都表示赞赏。

1 个答案:

答案 0 :(得分:1)

首先,您应该使用接口(SessionRepositoryFindByIndexNameSessionRepository)与您的存储库进行交互,并注入由Spring Session配置创建并在应用程序上下文中注册为bean的实例而是自己实例化JdbcOperationsSessionRepository

基本上有两种方法可以注入FindByIndexNameSessionRepository实例 - 注入和使用原始类型,或者参数化(尊重FindByIndexNameSessionRepository<S extends Session>的原始契约)。

原始类型方法:

class RawConsumer {

    @Autowired
    private FindByIndexNameSessionRepository sessionRepository;

    void consume() {
        Session session = (Session) this.sessionRepository.createSession();
        session.setAttribute("test", UUID.randomUUID().toString());
        this.sessionRepository.save(session);
    }

}

参数化类型方法:

class ParameterizedConsumer<S extends Session> {

    @Autowired
    private FindByIndexNameSessionRepository<S> sessionRepository;

    void consume() {
        S session = this.sessionRepository.createSession();
        session.setAttribute("test", UUID.randomUUID().toString());
        this.sessionRepository.save(session);
    }

}