2015-07-20 4 views
0

Я пытаюсь сохранить некоторые данные внутри атрибута сеанса, но я испытываю некоторые странные проблемы при попытке обновить их впоследствии. Я использую Spring boot 1.2.4Весеннее обновление значений @SessionAttributes

Я создал контрольный контроллер для описания проблемы.

@RestController 
@SessionAttributes(TestController.ATTRIBUTE) 
public class TestController { 

    public static final String ATTRIBUTE = "attribute"; 

    @ResponseStatus(value = HttpStatus.OK) 
    @RequestMapping(value = "/set/{value}", method = RequestMethod.POST) 
    public void set(@PathVariable Long value, HttpSession session) { 
     System.out.println("Set value to: " + value + " session id:\t" + session.getId()); 
     session.setAttribute(ATTRIBUTE, value); 
    } 

    @ResponseStatus(value = HttpStatus.OK) 
    @RequestMapping(value = "/get", method = RequestMethod.GET) 
    public void get(HttpSession session) { 
     System.out.println("Value: " + session.getAttribute(ATTRIBUTE) + " session id:\t\t" + session.getId()); 
    } 
} 

Например, если я называю эти методы, как это:

localhost:8080/set/1 
localhost:8080/set/2 
localhost:8080/get 

Я ожидаю, чтобы получить выходной сигнал, который выглядит следующим образом (сеансовые идентификаторы исключены):

Set value to: 1 
Set value to: 2 
Value: 2 

Однако то, что я (включая идентификационные данные сессии):

Set value to: 1 session id: 9D6F9948E81654E4087F418EF6BF5157 
Set value to: 2 session id: 9D6F9948E81654E4087F418EF6BF5157 
Value: 1 session id:  9D6F9948E81654E4087F418EF6BF5157 
+0

Распечатайте идентификатор sesssion в методах get & set, чтобы убедиться, что вы смотрите на правильную сессию – 6ton

+0

Я обновил вопрос с помощью идентификаторов сеанса. Это тот же сеанс. – Edd

ответ

0

Мой коллега предложил другой подход, который, кажется, работает очень хорошо.

Я создал класс для хранения данных, которые мне нужны.

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class DataHolder { 

    private Long data; 

    public DataHolder() { 
     data = 0L; 
    } 

    public Long getData() { 
     return data; 
    } 

    public void setData(Long data) { 
     this.data = data; 
    } 
} 

И в моем контроллере я просто @Autowire объекта.

@RestController 
class SomeController { 

    @Autowired 
    private DataHolder dataHolder; 
    ... 
} 

Поступая таким образом, я могу поделиться этими данными между другими контроллерами, а также, единственная, что нужно сделать, это @Autowire аннотация на объекте в каждом контроллере, который нуждается в этих ценностях.

Смежные вопросы