2016-09-30 90 views
1

我需要根据用于访问应用的主机名来设置vaadin应用的主题,例如app.company.de使用“valo”,app.company.org使用“org-theme”。 如果我在UI类中设置了编程UI,我会得到一个“闪烁”,因为首先使用来自@Theme的主题。 我也试图通过增加BootstrapListener这样的修改引导页:按主机名设置vaadin主题

  @Override 
      public void modifyBootstrapPage(BootstrapPageResponse response) { 
       Document doc = response.getDocument(); 
       for (Element script : doc.getElementsByTag("script")) { 
        if (script.html().contains("\"theme\": \"valo\"")) { 
         String old = script.html(); 
         String newHtml = old.replace("valo", THEME_NAME); 
         script.html(newHtml); 
        } 
       } 
      } 

但是,这导致了一些逃避问题,其中之一可能会解决,但我仍然不觉得通过改变引导JS的好这样一种拙劣的方式。

有没有办法挂钩到创建引导js的地方?

+0

我不知道这将是一个完美的解决方案,但如果您使用的是Apache HTTP服务器,你可以添加一个重写规则/ VAADIN /主题/ VALO/*到/ VAADIN /主题/ org-theme/*根据请求标题 –

+0

您是什么时候设置主题的?在UI类的'init'方法中? –

+0

@SteffenHarbich如果你在'init'中设置它,你会得到闪烁效果,至少对我来说它是7.7.3。奇怪的是,如果我尝试在构造函数中设置它,它没有任何作用......我得到了“驯鹿”的外观和感觉,并且我没有找到任何有关此行为的参考,我想知道这是否是期望的行为... – Morfic

回答

1

如何使用自定义UIProvider覆盖getTheme方法?

public String getTheme(UICreateEvent event) {...}

另一种解决方案可以extendinf VaadinServletService并重写getConfiguredTheme

public String getConfiguredTheme(VaadinRequest request) {...}

+0

扩展UIProvider的工作原理。你知道如何从'UICreateEvent'中找到requestURL而不投射到'HttpServletRequestWrapper'吗? – dve

+0

至少一个演员必须完成。但是你可以避免以这种方式投射到HttpServletRequestWrapper '((VaadinServletRequest)uiCreateEvent.getRequest())。getHttpServletRequest()' –