2016-09-30 86 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()' –