2016-12-16 35 views
1

我使用的RESTEasy 3.1.0.CR3在Tomcat的8.5的servlet的初始化的RESTEasy JAX-RS應用程序,通過註釋(無web.xml):不調用@PreDestroy

<dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-jaxrs</artifactId> 
     <version>3.1.0.CR3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-servlet-initializer</artifactId> 
     <version>3.1.0.CR3</version> 
    </dependency> 

我有一個JAX-RS應用程序,我需要知道之前被銷燬/從容器中卸載,這樣我就可以釋放一些資源(停止線程):

@ApplicationPath("/") 
public class MyRESTApplication extends Application { 

    … 

    @Override 
    public Set<Class<?>> getClasses() { 
    … 
    } 

    @Override 
    public Set<Object> getSingletons() { 
    … 
    } 

    @PreDestroy 
    public void end() { 
    //TODO release resources 
    } 

但我end()方法似乎並沒有被調用。我做錯了嗎?有沒有更好的方法來檢測JAX-RS應用程序何時被取下?

+0

[我認爲這是一個相關的錯誤](https://java.net/jira/browse/JERSEY-1982)對不起,我對一個實體bean感到困惑。我不知道JAX-RS是否有方法PostDestroy – Gatusko

+0

澤西島臭蟲與RESTEasy有什麼關係? –

+0

你可以用一個完整的例子創建一個存儲庫嗎?到目前爲止,我看不出任何錯誤的代碼。 – Adam

回答

0

我不確定這是否受支持。對於@PreDestory應用同樣的規則像@PostConstruct

此標註必須在支持依賴注入的所有類的支持。

是否支持Application類中的依賴注入? JAX-RS實現可以集成託管Bean,EJB或CDI,但這是可選的。 JAX-RS本身通過@Context提供依賴關係注入,但在Application類(規範的第9.2.1)中明確指出而不是

因此@PreDestory可能在某些環境中工作,但不能保證。

在您的環境中,我將執行自定義ServletContextListener並釋放#contextDestroyed中的資源。你Application類應該訪問via the ServletContext

Map<String, ResteasyDeployment> deployments = (Map<String, ResteasyDeployment>) 
    request.getServletContext().getAttribute("resteasy.deployments"); 
ResteasyDeployment deployment = deployments.get("/application/path"); 
Application application = deployment.getApplication(); 

你也可以在自定義ServletContextListener處理所有的事情,而不應用類別及引用存儲爲ServletContext的屬性。

+0

我的'ServletContextListener'如何得到我的JAX-RS應用程序的引用? (在同一臺服務器上運行此應用程序的多個實例,並且每個實例都有關閉時需要釋放的資源。) –

+0

是的,這是正確的。 –

+0

對不起,您是否回答了我的問題「我的ServletContextListener如何獲得對我的JAX-RS應用程序的引用?「 –

相關問題