Как сделать атрибут Model глобальным?

Я использую Spring MVC Framework, и мне бы хотелось, чтобы все страницы .jsp в представлении имели доступ к атрибутам пользователя (имя, пол, возраст...). До сих пор я использовал метод addAttribute Model(UI) в каждом контроллере для передачи текущих атрибутов пользователя в View. Есть ли способ сделать это только один раз и избежать того же кода в каждом Controller?

Ответ 1

Вы можете использовать аннотацию Spring @ControllerAdvice для нового класса контроллера следующим образом:

@ControllerAdvice
public class GlobalControllerAdvice {

    @ModelAttribute("user")
    public List<Exercice> populateUser() {
        User user = /* Get your user from service or security context or elsewhere */;
        return user;
    }
}

Метод "populateUser" будет выполняться по каждому запросу, и поскольку он имеет аннотацию @ModelAttribute, результат метода (пользователя) будет помещен в модель для каждого запроса.

Пользователь будет доступен в вашем jsp, используя ${user}, поскольку это имя было присвоено @ModelAttribute (пример: @ModelAttribute ( "fooBar" ) → ${fooBar})

Вы можете передать некоторые аргументы в аннотацию @ControllerAdvice, чтобы указать, какие контроллеры рекомендуются этим глобальным контроллером. Например:

@ControllerAdvice(assignableTypes=FooController.class,BarController.class})
or
@ControllerAdvice(basePackages="foo.bar.web.admin","foo.bar.web.management"}))

Ответ 2

Если речь идет об пользовательских атрибутах, вы можете привязать модель bean к сеансу как к атрибуту, доступ к которому можно получить на каждом представлении. Это нужно сделать только один раз.

Другой вариант может заключаться в том, чтобы реализовать HandlerInterceptor и разоблачить модель для каждого запроса.