2016-12-16 5 views
1

내가 톰캣 8.5은 서블릿 초기화와 RESTEasy가 3.1.0.CR3을 사용하고 호출하지 응용 프로그램을 통해 주석 (NO web.xml는) :RESTEasy가 JAX-RS의 @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를 나는 그것이/파괴 컨테이너에서 제거되기 전에 내가 어떤 리소스를 해제 할 수 있도록 알 필요가 응용 프로그램 (thread를 정지) :

@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) 그리고 유감스럽게도 나는 entitie 빈과 혼동 스러울 것이다. JAX-RS에 PostDestroy 메서드가 있는지 모르겠다 – Gatusko

+0

저지 버그와 RESTEasy의 관계는 무엇인가? –

+0

완전한 예제로 저장소를 만들 수 있습니까? 지금까지 제공 한 코드에는 이상한 점은 아무것도 없습니다. – Adam

답변

0

이것이 지원되는지 확실하지 않습니다. @PreDestory의 경우 동일한 규칙이 @PostConstruct에 같이 적용

이 주석은

은 의존성 주입을 지원하는 모든 클래스에서 지원해야한다.

Application 클래스의 종속성 주입이 지원됩니까? JAX-RS 구현은 Managed Beans, EJB 또는 CDI를 통합 할 수 있지만 선택 사항입니다. JAX-RS 자체는 @Context을 통해 종속성 주입을 제공하지만 Application 클래스 (사양 9.2.1)의 이 아닌을 명시 적으로 제공합니다.

그래서는 일부 환경에서 작동하지만 보증 할 수는 없습니다.

사용자 환경에서는 ServletContextListener 사용자 지정을 구현하고 #contextDestroyed에 리소스를 릴리스합니다. 귀하의 Application 클래스는 접근 via the ServletContext해야한다 :의 ServletContext 속성으로 당신은 또한 응용 프로그램 클래스 및 저장 참조하지 않고 사용자 정의 ServletContextListener 모든 것을 처리 할 수 ​​

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

.

+0

내 'ServletContextListener'가 내 JAX-RS 응용 프로그램에 대한 참조를 얻으려면 어떻게해야합니까? (이 응용 프로그램의 여러 인스턴스가 동일한 서버에서 실행되고 있으며 종료 할 때 각 리소스를 해제해야합니다.) –

+0

예. –

+0

죄송합니다. 제 질문에 답변 해 주셨습니다. "내 ServletContextListener가 내 JAX-RS 응용 프로그램에 대한 참조를 얻으려면 어떻게해야합니까?" –