我需要在Jersey ServletContainer中熱部署和 - 部署資源。在Jersey中動態(不)部署資源
似乎有沒有辦法在ResourceConfig「註銷」的資源,所以我下面的路徑是用新的一套替換的所有資源。
雖然the documentation上說ResourceConfig registerResources替換所有資源,通過源代碼瀏覽似乎違背這一點。
我找到的解決方案是一個全新的ResourceConfig重新加載ServletContainer。
Set<Class<?>> classes = ...
ResourceConfig config = new ResourceConfig(classes);
container.reload(config);
這工作正常,直到我部署資源,導致ModelValidationException。之後,我無法讓ServletContainer恢復正常狀態。
如果我看看源代碼:
public void reload(final ResourceConfig configuration) {
try {
containerListener.onShutdown(this);
webComponent = new WebComponent(webComponent.webConfig, configuration);
containerListener = webComponent.appHandler;
containerListener.onReload(this);
containerListener.onStartup(this);
} catch (final ServletException ex) {
LOGGER.log(Level.SEVERE, "Reload failed", ex);
}
}
的ModelValidationException從WebComponent的構造函數拋出。 之後,任何調用重載都會導致onShutdown方法中的異常,這是由ServiceLocatorImpl的preDestroy方法中的checkState引起的。
我可以忽略驗證錯誤
ResourceConfig config = new ResourceConfig(classes);
config.property(ServerProperties.RESOURCE_VALIDATION_IGNORE_ERRORS,
Boolean.TRUE);
container.reload(config);
沒有辦法然而現在,以找出是否有,但探索的記錄,這是一樣糟糕的錯誤避免該異常,真的。
每heenenee's comment我試過繼承ServletContainer,但類似的東西給出了問題,因爲ResourceConfig不能放在兩個WebComponents中。
我試圖創建關停,讓早早退出前WebComponent的,但如果在資源沒有錯誤(因爲WebComponent的創建後的resourceconfig不能修改)
失敗的實際重裝@Override
public void reload(ResourceConfig configuration) {
try {
new WebComponent(new WebServletConfig(this), configuration);
} catch (ServletException e) {
LOGGER.log(Level.SEVERE, "Reload failed", e);
List<ResourceModelIssue> resources = Collections.emptyList();
throw new ModelValidationException(e.getMessage(), resources);
}
super.reload(configuration);
}
有沒有另一種方法來熱卸載資源?重新啓動失敗後,有沒有辦法重置ServletContainer?
你可以嘗試子類'ServletContainer',重載'reload(ResourceConfig)'來捕獲'RuntimeException'並記錄一個錯誤,然後在你的web.xml中指定你的子類。 – heenenee