2011-08-27 6 views
0

@Singleton JavaEE 6의 새 기능을 사용한 적이 한번도 없었습니다.싱글 톤을 사용하여 기본 관리 계정 만들기

저는 앱 독주인 (암호를 아는 사람)이 앱의 일부 콘텐츠에 액세스 할 수있게 해주는 암호를 보유하기 위해 S Singleton을 만들려고했습니다.

나는 이것을 tutorial 다음에 구현하려고 시도했지만 작동하지 않습니다.

내가 싱글 톤 bean을 생성 : 이 내가 무슨 짓을 내가 @EJB

를 사용하여 관리 빈에서 싱글을 주입하려고

public interface IAdminAcountEJB { 

    public abstract String getPassword(); 
} 

그런 인터페이스를 추출

@Singleton 
@Startup 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public class AdminAcountEJB implements IAdminAcountEJB { 

    private String password; 

    @PostConstruct 
    public void init() { 
     password = "password"; 
    } 


    @Lock(LockType.READ) 
    public String getPassword() { 
     return password; 
    } 
} 

@Named("managementBB") 
@SessionScoped 
public class ManagementBB implements Serializable{ 

    @EJB 
    private IAdminAcountEJB managementEJB;  
    private String input;  
    private boolean authorized; 

    public String seeWhatsUp() { 
     if(input.equals(managementEJB.getPassword())) { 
      authorized = true; 
      return "manage?faces-redirect=true;"; 
     } 
     return "index?faces-redirect=true;"; 
    } 

    //Get set methods... 

} 

마지막으로 내가하는 일은 표시되는 마크 업을 만드는 것입니다. 올바른 암호를 입력 케이스 :

<h:form rendered="#{managementBB.authorized == false}"> 
      <h:inputSecret value="#{managementEJB.input}"/> 
      <h:commandButton value="..." action="#{managementEJB.seeWhatsUp}"/> 
     </h:form> 

<h:form rendered="#{managementBB.authorized}"> 
      CORRECT PASSWORD!! 
</h:form> 

을 그것은 모두가 나에게 좋아 보인다,하지만 난이 페이지에 액세스 할 때, 콘솔은 말한다 :

javax.naming.NameNotFoundException : ejbinterfaces.IAdminAcountEJB 번호의 ejbinterfaces .AdminAcountEJB 찾을 수 없습니다.

왜 작동하지 않는지,이 방법은 내가 다른 싱글 톤이 아닌 EJB를 주사하지만 @ 싱글 톤과 함께 작동하지 않습니다.

- 어떻게 해결할 수 있습니까?

- 나는 또한이 목적을 위해 singletone을 사용하는 것에 대해 어떻게 생각하는지 알고 싶습니다. 좋은 생각입니까?

답변

2

보기의 EL 표현식 내에서 싱글 톤을 참조하기 때문에 문제는 @Named으로 주석되어야한다는 것입니다. 콩을 다른 사람들 안에서만 사용한다면 이것은 필요하지 않습니다.

설계에 관하여, 제 2 페니는 다음과 같습니다

  • 자바 EE 6를 사용하고 있기 때문에, 당신은 그것을 위해 인터페이스를 지정하지 않아도됩니다. 그럼에도 불구하고 그것을 원한다면/필요하다면, 그것을 (당신이 애플을 위해 일하는 것을 제외하고) 뭔가를 부르지 말고, 도메인 관련 이름을 부여하십시오.
  • 동시 읽기 액세스를 허용하는 싱글 톤을 사용하면 코어 데이터가 정상입니다. 단, 코드 내에서 암호를 넣지는 않지만 데이터베이스 테이블에 암호를 넣지는 않습니다. 시작시 테이블을 읽는 공급자에 대해 해시를 사용하고 공급자를 사용하는 것이 좋습니다.
  • 일반적으로 싱글 톤은 응용 프로그램에 병목 현상을 유발할 수 있습니다. 정의에 따르면 확장 성이 없기 때문입니다. 따라서 사용률은 매우 낮습니다. 액세스 속도가 매우 낮다고 가정 할 수 있으므로 좋습니다. 소개 할 ​​수있는 다른 문제는 우리가 변경된 데이터를 가지고 있다면 경합 조건 (귀하의 경우가 아님)입니다. 왜냐하면 우리는 하나의 인스턴스 만 병렬로 호출되기 때문입니다.
+0

"# {managementEJB.seeWhatsUp}"는 싱글 톤을 사용하는 백킹 빈의 메소드이지만 직접 호출하지는 않습니다. EL 구문에서 싱글 톤을 참조하지 않습니다. 또한 싱글 톤에서'@ Named' 주석을 사용하는 방법에 혼란 스럽습니다. 어떻게 호출해야합니까? 그건 그렇고 +1 데이터베이스 아이디어를 사용하여 시작시 읽기 (흥미로운 소리) – sfrj

+0

죄송합니다, 난 그냥 실수를 발견, 나는 EJB를 대신 페이지에서 콩을 EJB를 호출했다. 주의가 필요하다면 :) – sfrj

관련 문제