Доступ к сессионному компоненту внутри контроллера - PullRequest
4 голосов
/ 08 мая 2011

Я экспериментирую с сессионными компонентами в Spring 3. У меня есть следующее определение компонента:

<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" />

Вот net.sandbox.controllers.RegistrationController, класс контроллера, которому нужен доступ к этому компоненту.Для краткости я удалил импорт.

@Controller
@RequestMapping("/register")
public class RegistrationController {
    private UserInfo userInfo;   // This should reference the session-scoped bean

    @RequestMapping(method = RequestMethod.GET)
    public String showRegForm(Model model) {
        RegistrationForm regForm = new RegistrationForm();
        model.addAttribute("regform", regForm);
        return "regform";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return "regform";
        }

        userInfo.setUserName(regForm.getFirstName());
        model.addAttribute("regform", regForm);
        return "regsuccess";
    }
}

Есть ли способ автоматически связать сессионный компонент, определенный мною, с переменной-членом private UserInfo userInfo в RegistrationController?

Ответы [ 4 ]

8 голосов
/ 08 мая 2011

Да - см. раздел 3.4.5.4 руководства Spring, "Scoped bean как зависимости" .

Вкратце, вы можете попросить Spring обернуть ваш сессионный компонент в одноэлементный прокси-сервер, который ищет правильный сеанс при вызове метода для этого объекта. Это называется «прокси с областью действия» и использует макрос конфигурации <aop:scoped-proxy>. Затем вы можете ввести ссылку так же, как и любую другую (например, <property> или @Autowired). Подробности смотрите по ссылке выше.

1 голос
/ 28 июня 2011

По умолчанию Spring создает прокси, реализуя интерфейс во время выполнения. Таким образом, на прокси доступны только те методы, которые определены в любых интерфейсах, реализуемых UserInfo (если есть). Возможно, вам придется создать подходящий интерфейс, который включает метод setUserName ().

В качестве альтернативы вам потребуется принудительно настроить прокси на основе CGI (прокси - это подкласс вашего класса, созданный во время выполнения, поэтому ему не нужен интерфейс). Укажите:

<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" >
   <aop:scoped-proxy proxy-target-class="true"/>
</bean>
0 голосов
/ 09 сентября 2017

Если вам не нравится XML, вы также можете использовать ObjectFactory<T> следующим образом:

@RestController
public class MyController {
    private final ObjectFactory<MySessionScopedComponent> OFSession;

    @Autowired
    public MyController(ObjectFactory<MySessionScopedComponent> OFSession) {
        this.OFSession = OFSession;
    }

    @RequestMapping(path = "/path", method = RequestMethod.GET)
    public String myMethod () {
        MySessionScopedComponent sessionBean = OFSession.getObject();
        // Do some stuff
        return bean.myValue();
    }
}

Примечание: протестировано с Spring Boot 1.5.6 (Spring 4.3)

0 голосов
/ 08 мая 2011

Об этом комментарии:

Я пытался применить эту технику.Я вставил определение бина, и я @ Autowired'd приватную UserInfo userInfo.Кажется, это работает, но по какой-то причине функция установки бина не выполняется должным образом ... i.imgur.com/zkxVA.png - Pieter 1 час назад

Если вы используете интерфейс на основе интерфейсапрокси, метод установки недоступен на Прокси, если интерфейс не имеет метода установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...