2014-04-22 38 views
0

我在如何動態地添加一些web服務而苦苦掙扎。我正在使用Scalatra來構建web服務框架。即時編譯Scala類以實現web服務

我想讓開發人員能夠更改身份驗證,例如,以便不使用硬編碼的憑據,而是使用數據庫或密碼文件或他們所需的任何內容。

我也想讓他們在servlet中添加新的webservices。

所以,我想要做的是在引導代碼中加載並重新編譯該類,然後使用該版本。

我看了這個,但我需要重新編譯整個類,而不是片段。

Generating a class from string and instantiating it in Scala 2.10

這是我已經盡力了,但我添加了一個「/幫助」 web服務,但沒有找到,所以新的類沒有被尚未使用。

class ScalatraBootstrap extends LifeCycle { 

    override def init(context: ServletContext) { 

    val sourceDir = new java.io.File("C:/Temp/MyServlet.scala") 
    val sse = ScalaScriptEngine.onChangeRefresh(sourceDir) 
    sse.refresh 
    println("*** - " + sse.compilationStatus.startTime + " " + sse.compilationStatus.stopTime) 

    context.mount(sse.get[MyServlet]("test.proj.MyServlet"), "/*") 

我使用的那一刻scalascriptengine(https://code.google.com/p/scalascriptengine/)。

那麼,如何在Web服務中重新編譯類文件,當它可能在同一個文件中有實例類,註釋和對象類時,

我想知道是否需要在Groovy中使用webservice,但我更願意保持它的功能。

UPDATE

我曾想過插件第一,但如何將添加新的Web服務這樣碰到一個問題,它可能是Scalatra的是不會是正確的選擇,我可能需要更改我的REST服務框架。

最終,我希望能夠在不需要重新啓動應用程序的情況下即時更改Web服務,並且重新編譯源代碼將允許這樣做。

+0

我建議一個插件方案,而不是源編譯方法。 –

+0

@RandallSchulz - 我如何做一個實際添加新的webservices的插件方案?例如,我一開始沒有「/ help」作爲web服務,但我想添加它。插件是我的第一個想法,但我堅持添加新的Web服務。 –

+0

@RandallSchulz - 如果你把你的評論作爲答案,我會給你信貸。 –

回答

1

實現插件可供性並不難,至少在合理簡單的情況下。基本要素是:

  • 定義插件實現義務的特徵或抽象類。
  • 用於將插件的代碼獲取到類路徑上的方法。或者,如果您熟悉使用類加載器,則可以動態執行此操作。我沒有太多的經驗。
  • 一旦你有了一個java.lang.Class[P <: PlugInType]的實例,只要你不需要構造函數參數就可以得到一個實例。
  • 插件特徵中的一種協議,允許插件保留頂級URL路徑段,從中獲取覆蓋所有這些路徑的Scalatra路由。然後您可以通過插件實例分配與該前導路徑段相匹配的請求。你所要做的就是確保你不要讓兩個插件聲稱相同的路徑,或者你有更多的解決方法。
0

感謝@RandallSchultz我找到了一個可行的解決方案。

override def init(context: ServletContext) { 

    val sourceDir = new java.io.File("C:/Temp/HelpServlet.scala") 
    val sse = ScalaScriptEngine.onChangeRefresh(sourceDir) 
    sse.refresh 
    println("*** - " + sse.compilationStatus.startTime + " " + sse.compilationStatus.stopTime) 

    context.mount(new MyServlet, "/*") 
    context.mount(sse.get("org.myproject.rest.HelpServlet"), "/help/*") 

所以當我去「/幫助/幫助」時,我得到了我的幫助頁面,所以新的web服務被添加。

通過從文件中讀取,我可以在應用程序運行時添加它。