Spring MVC + Thymeleaf:将变量添加到所有模板的上下文

Spring MVC + Thymeleaf: adding variable to all templates' context

如何添加一个 "global" 变量,例如要在我的模板上下文中使用的用户名?

目前我正在为我的 TemplateController 中的每个 ModelAndView 对象明确设置这些。

您可能想看看@ModelAttribute。 http://www.thymeleaf.org/doc/articles/springmvcaccessdata.html

Blockquote In Thymeleaf, these model attributes (or context variables in Thymeleaf jargon) can be accessed with the following syntax: ${attributeName}, where attributeName in our case is messages. This is a Spring EL expression.

有几种方法可以做到这一点。

如果要将变量添加到单个控制器提供的所有视图,可以添加 @ModelAttribute 注释方法 - see reference doc.

请注意,您也可以使用相同的 @ModelAttribute 机制,一次处理多个控制器。为此,您可以在用 @ControllerAdvice - see reference doc.

注释的 class 中实现 @ModelAttribute 方法

如果您只是想将 application.properties 中的内容添加到 thymeleaf 模板中,那么您可以使用 Spring 的 SpEL

${@environment.getProperty('name.of.the.property')}

@ControllerAdvice 为我工作:

@ControllerAdvice(annotations = RestController.class)
public class AnnotationAdvice {

     @Autowired
     UserServiceImpl userService;

     @ModelAttribute("currentUser")
     public User getCurrentUser() {
         UserDetails userDetails = (UserDetails) 
         SecurityContextHolder.getContext()
               .getAuthentication().getPrincipal();

      return userService.findUserByEmail(userDetails.getUsername());
     }
  }

这是 Spring Boot 和 Thymeleaf 的示例。

首先,我们需要创建一个@ControllerAdvice:

@ControllerAdvice
public class MvcAdvice {

    // adds a global value to every model
    @ModelAttribute("baseUrl")
    public String test() {
        return HttpUtil.getBaseUrl();
    }
}

现在,我们可以在模板中访问 baseUrl

<span th:text=${baseUrl}></span>