@SessionAttributes в Spring не обновляется

194
01 февраля 2020, 07:50

У меня есть два контроллера

@Controller
@SessionAttributes("user")
public class ControllerA {
    @PostMapping("/method_a")
    @ResponseStatus(code = HttpStatus.NO_CONTENT)
    public void methodA(@SessionAttribute User user, HttpSession session){
           //здесь происходит изменение юзера
         session.setAttribute("user", user);
    }
}
@Controller
@SessionAttributes("user")
public class ControllerB {
    @GetMapping("/method_b")
    public String methodB(@SessionAttribute User user){
    //user - старый
    }
}

Сначала происходит обращение к methodA, где я изменяю юзера и снова кладу в сессию, но затем при обращении к methodB юзер остался старый. Как правильно работать с @SesionAttributes

Answer 1

Ошибка кажется в том, что вы в methodA(@SessionAttribute User user пытаетесь вызвать не инициализированную user и кажется по этому у вас все ломается. 2. В AController аннотацию @SessionAttributes("user") нужно удалить. Посмотрите код ниже, надеюсь вам поможет.

Вот рабочий код:

AController

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
@RestController
public class AController {
    @RequestMapping(value = "/method_a", method = RequestMethod.GET, produces = "application/json")
    public Map methodA(HttpSession session,
                       @RequestParam(name = "name", required = false) Optional<String> name) {
        //здесь происходит изменение юзера
        User user = new User(name.orElse("Default"));
        session.setAttribute("user", user);
        session.setAttribute("value", name.orElse("Default"));
        System.out.println(user.getName());
        System.out.println(session.getId());
        return Collections.singletonMap("nameSet", user.getName());
    }
}

BController

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttributes;
import java.util.Collections;
import java.util.Map;
@RestController
@SessionAttributes("user")
public class BController {
    @GetMapping("/method_b")
    public Map methodB(@ModelAttribute User user) {
        return Collections.singletonMap("nameGet", user.getName());
    }
}

User

public class User {
    private String name;
    public User() {
    }
    public User(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
READ ALSO
Класс Object и аргументы

Класс Object и аргументы

Изучаю класс Object: Множество методов класса ArrayList используют основной полиморфический тип ObjectПоскольку каждый класс в языке Java - потомок класса...

182
Андроид-ардуино. Вывод данных с ардуино в textview

Андроид-ардуино. Вывод данных с ардуино в textview

Мне нужно просто получать данные с ардуина и выводить на textview построчноС данным кодом текст не выводится

235
Не верно определяются устройства

Не верно определяются устройства

Написал небольшой код, который в моем случае воспроизводит проблему, и не определяет устройства правильно

195