2017-08-02 96 views
0

我目前正在使用springboot和Vaadin 8微服務,我想用Embedded UI 2.0附加的Vaadin。
我第一次嘗試中嵌入簡單Springboot + Vaadin到宿主Vaadin應用如圖中 example
下面是宿主應用程序的結果代碼:嵌入Vaadin + Springboot應用到Vaadin UI使用Emdedded UI插件

import ... 
import org.vaadin.embedded.VaadinUIComponent; 


@Theme(ValoTheme.THEME_NAME) 
public class HostUI extends UI { 

@Override 
protected void init(VaadinRequest vaadinRequest) { 
    /*My Spring boot application */  
    VaadinUIComponent ui1 = new VaadinUIComponent("http://localhost:8081/app2/"); 
    ui1.setSizeFull(); 
    /* A simple vaadin application*/ 
    VaadinUIComponent ui2 = new VaadinUIComponent("http://localhost:9020"); 

    HorizontalSplitPanel split = new HorizontalSplitPanel(ui1, ui2); 
    split.setSizeFull(); 
    setContent(split); 
} 

,但我一直有與VAADIN/*資源負載的問題:

{"timestamp":1501683162735,"status":404,"error":"Not Found","message":"No message available","path":" 
/app2/widgetsets/ws84167e472e91ff0ea8255f8f1b189aa0/ws84167e472e91ff0ea8255f8f1b189aa0.nocache.js"} 

其中/app2/是通向我的應用程序。

我不知道該路徑的資源如何解決,但我知道Vaadin目錄應該是/app2/VAADIN/*以來的視覺元件和其他vaadin編譯資源工作得很好,當我打開可用應用程序直接從我的瀏覽器。
下面是一些附加信息:

  • Vaadin版本:8.0.5
  • 嵌入式UI插件版本:2.0
  • 我用ValoTheme所有3個應用程序(主機和嵌入)
  • vaadin.widgetset.mode設置爲fetch模式
  • 我確保爲應用程序啓用了CORS。

我搜索了很長時間來解決這個問題,但沒有找到足夠的來源爲這種特殊情況,我也是一個初學者在春季和Vaadin,所以我絕對可以使用一些幫助。

+0

沒有檢查的附加來源,但我有一種預感它的緊耦合的引導,很可能調度的servlet和servlet的Vaadin維護您的應用程序的要求。如果您可以提供[sscce](http://sscce.org)來輕鬆地重現您的問題,它可能會幫助您獲得一些答案。 – Morfic

+0

這是一個[鏈接](https://github.com/zelha/45465131-sscce.git)到一個存儲庫,我重現了錯誤,如果沒關係。 –

回答

0

TL; DR;版本

這似乎是一個插件中的錯誤,並且有一個類似的issue open on their tracker,不知道它是你還是其他人。但爲什麼你首先需要使用它?你想要實現的是什麼,這是常規的Vaadin應用程序無法完成的,你需要嵌入多個UI?


詳細版本

所以我做了一些挖掘和你的觀察是正確的,/VAADIN/從路徑丟失。在春季啓動應用程序中,可能還會有其他由vaadinServlet處理的失敗請求,例如心跳和uidl。

單機應用程序請求:

stand alone app request

嵌入式應用程序請求:

embedded app request

隨着一點點的模式調試,似乎附加確實使用不正確的路徑: incorrect path

最後追溯到BAC k到./VAADIN的錯誤正則表達式替換爲http://localhost:9030/而不是正確的http://localhost:9030/VAADIN

在我看來,就像它在附加的錯誤,但可能只有開發可以確認或解釋爲什麼它正在這樣做。

regex replacement

這樣的工作,我們周圍可以使用彈簧控制器重定向請求到正確的URL,但即使這樣有它的侷限性。它在第一頁刷新時打破,因爲通常增加的v-uiId仍爲0.

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.HandlerMapping; 

import javax.servlet.http.HttpServletRequest; 

@Controller 
public class VaadinRedirectController { 
    private static final String INCOMPLETE_WIDGETSET_PATH = "/widgetsets/**"; 
    private static final String INCOMPLETE_THEME_PATH = "/themes/**"; 
    private static final String INCOMPLETE_UIDL_PATH = "/UIDL/**"; 
    private static final String INCOMPLETE_HEARTBEAT_PATH = "/HEARTBEAT/**"; 

    @RequestMapping(value = {INCOMPLETE_WIDGETSET_PATH, INCOMPLETE_THEME_PATH,}) 
    public String redirectWidgetsetAndThemeRequests(HttpServletRequest request) { 
     return createRedirectPath(request, "VAADIN"); 
    } 

    @RequestMapping(value = {INCOMPLETE_UIDL_PATH, INCOMPLETE_HEARTBEAT_PATH}) 
    public String redirectUidlAndHeartbeatRequests(HttpServletRequest request) { 
     return createRedirectPath(request, "vaadinServlet"); 
    } 

    private String createRedirectPath(HttpServletRequest request, String prefix) { 
     String path = "redirect:/" + prefix + getPath(request); 
     if (request.getQueryString() != null && !request.getQueryString().isEmpty()) { 
      path += "?" + request.getQueryString(); 
     } 
     return path; 
    } 

    private Object getPath(HttpServletRequest request) { 
     return request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); 
    } 
} 
+0

感謝您的回答。 我需要使用附加組件作爲UI組合問題的解決方案,因爲我必須構建一些UI屏幕或頁面來顯示我的多個服務的UI(以便每個服務都可以擁有它自己的獨立UI,並且可以訪問沒有「主機」應用程序)。 關於你的解決方案,我試着實現它,並做了一些測試: 控制器按照預期重定向所有請求,比如'localhost:8080/widgetsets/**';但不是'localhost:8080widgetsets/**',這是主機應用程序產生的URL。我不知道是否有可能的解決方案。 –

+0

@ Zineb.elh是的,忘了這一點,在你的主機應用程序中添加一個'/'到啓動應用程序url :-)。但請記住,它仍然在首次刷新時崩潰...還沒有找到解決方案。 – Morfic

+0

再次感謝您的幫助。我知道這不是問題的最終解決方案。我正在等待附加開發人員研究它。我試圖理解每個請求發送的'v-uiId'的作用,以便解決這個問題。我注意到UI不會相互作用(即,當我點擊一個按鈕時不會改變)。這與'v-uiId'問題有關嗎? –