2013-01-05 4 views
9

아마도 내 질문은 사소한 것이지만 이전에는 응용 프로그램 범위 bean을 사용하지 않았을 것입니다. 데이터베이스에서 시간이 많이 걸리는 트랜잭션을 수행해야하기 때문에 응용 프로그램 bean이 필요합니다. 내 검색이 내 호기심을 만족시키지 못했습니다. 이유는 모르겠지만 bean (null)을 초기화 할 수 없거나 응용 프로그램이 손상되었습니다. 그래서 나는JSF 응용 프로그램 범위 인스턴스화 및 주입

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 
... 
} 

사실 = 열망 내가 그 응용 프로그램 서버 (I GlassFish의 사용)을 시작할 때 빈 때마다 시작하는 JSF를 알려줍니다 읽을 응용 프로그램 범위에 콩을 가지고있다.

필자는이 주석을 넣어야하는 곳을 여러 곳에서 읽었으며 빈은 초기화됩니다. 나를 위해 그것을하지 않습니다 ... 나는 다른 콩에 응용 프로그램 빈을 주입 할 경우, 나는이 내가 주입 다른 콩에 오류가 있습니다

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @ManagedProperty(value = "#{container}") 
    private ApplicationContainer container; 

    @PostConstruct 
    public void init() { 
    container.contructContainer(); 
    } 

@PostConstuct 주석을 사용할 필요가 있음을 읽은 후 ...

  • 서버가 시작할 때 응용 프로그램 bean이 초기화되면 응용 프로그램 bean의 본문에서 필요한 조치를 수행합니까? 또는 삽입 된 빈에서 post 구조 메소드에서 완료 되었습니까?

응용 프로그램 빈을 처리하는 올바른 방법을 알려주십시오. 나는 정말 혼란 스럽다. ...

모두에게 감사한다!

답변

21

두 가지 잠재적 인 오류가 있습니다.

먼저 은 its javadoc에서 말한 것처럼 애플리케이션 범위가 지정된 JSF 관리 빈에서만 작동합니다. 따라서 @ApplicationScopedjavax.faces.bean 패키지 (따라서 javax.enterprise.context 패키지가 아닙니다!)를 사용한 경우에만 작동합니다. eager=true은 기본적으로 Bean이 나중에 EL에서 처음 참조 될 때가 아니라 webapp의 시작시 자동으로 인스턴스화된다는 것을 의미합니다.

둘째, 관리 빈 이름은 Javabeans 스펙에 따라 대문자로 된 형식의 클래스 이름을 기본값으로 사용합니다. @ManagedBean(name="container", eager=true)과 같은 관리 Bean 이름을 명시 적으로 지정하지 않았으므로 관리 bean 이름의 기본값은 applicationContainer이지만 여전히 #{applicationContainer} 대신 #{container}으로 참조하려고 시도하고 있습니다.

직면 한 문제/오류가 전혀 분명하지 않습니다. 예외가 발생하는 경우이를 반드시 읽고 해석해야하며, 이해할 수없는 경우 스택 추적을 포함하여 전체적으로 복사하십시오. 그것은 당신의 문제에 대한 모든 답변을 독자적으로 나타냅니다. 당신은 그것을 해석하고 이해해야 만합니다 (또는 우리는 단지 평신도의 용어로 설명해야만합니다). 당신은 정말로 그들을 무시하지 말고, 그들이 관련성이없는 장식 인 것처럼 질문 밖으로 내 보내야합니다. 그들은 그렇지 않습니다! 가져 오기 선언 그냥 확인하고, 디버깅을위한 일부 가난한 사람의 표준 출력 인쇄와

모든 모든는 완전하고 적절한 접근 방식은 완전 할 것 :

package com.example; 

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 

    public ApplicationContainer() { 
     System.out.println("ApplicationContainer constructed"); 
    } 

} 
package com.example; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    @ManagedProperty("#{applicationContainer}") 
    private ApplicationContainer container; 

    public TestsBean() { 
     System.out.println("TestsBean constructed"); 
    } 

    @PostConstruct 
    public void init() { 
     System.out.println("ApplicationContainer injected: " + container); 
    } 

    public void setContainer(ApplicationContainer container) { 
     this.container = container; 
    } 

} 
+0

가 당신에게 BalusC 감사하여 충분한 대답. 저는 일반적인 질문이 아닌 특정 질문이되기를 원했기 때문에 질문에 예외를 두지 않았습니다. 난 응용 프로그램 범위 콩 좀 더 구체적이고 다른 초기화 그들과 나머지가 필요하다고 생각하고 적절한 초기화, 그냥 비트와 조각을 발견하지 못했습니다. 다시 한 번 감사드립니다. – CyberGriZzly