2014-04-12 2 views
0

이것은 @Inject is injecting a new instance every time i use it과 비슷하지만, 해당 스레드에서 대답을 찾을 수 없습니다.@Inject는 세션에서 새 빈 인스턴스를 만듭니다.

저는 CDI와 JSF에 새로운 것이므로 JSF 주석 대신 CDI를 사용하려고합니다. MemberController에서 자격 증명을 검색하고 싶습니다. 빈 자체 (둘 다)는 jsf 페이지에서 호출됩니다. 문제는 MemberController의 Credential 인스턴스가 항상 null name/password를 갖기 때문에 Credential의 setter가 적중되었음을 확인했습니다. Credential의 두 인스턴스가 왜 있는지 이해할 수 없습니다. @ ManagedBean + @ ManagedProperty를 통해 원하는 것을 얻을 수 있습니다. 그러나 나는 CDI로 어떻게 같은 일을 할 수 있는지 알고 싶다.

내 환경

제이 보스 7.1.1 + 자바 EE 6

Credential.Java

import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 
import java.io.Serializable; 

@Named 
@SessionScoped 
public class Credential implements Serializable{ 
    private static final long serialVersionUID = 680524601336349146L; 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    private String password; 
} 

MemberController.Java

@Named 
@SessionScoped 
public class MemberController implements Serializable { 
    private static final long serialVersionUID = 8993796595348082763L; 

    @Inject 
    private Credential newCredential; 

    public void login() { 
     String msg = newCredential.getName()+":"+newCredential.getPassword(); 
    } 
} 

JSF 페이지 세그먼트

<p:inputText id="username" label="Username" value="#{credential.name}" /> 
<p:password id="password" label="Password" value="#{credential.password}" /> 
<p:commandButton value="Login" action="members" actionListener="#{memberController.login}" /> 

답변

1

는 IS 주입 새로운 인스턴스를 호출하지 않습니다 (처음으로 호출 된 경우 또는 삽입 된 bean에 요청 범위가있는 경우). 빈에 대해 사용하는 범위에 따라 다 (니다. 사용하는 범위는 애플리케이션을 사용하는 사람마다 새로운 빈 (자신의 세션 스코프 빈)을 생성합니다. 이 범위 내의 데이터는이 사용자에게만 표시됩니다. 응용 프로그램의 모든 사용자가 액세스 할 수있는 응용 프로그램의 전역 컨테이너 (모든 사용자에 대해 동일한 데이터 포함)가 필요하면 응용 프로그램 범위 또는 싱글 톤 bean을 만들어야합니다. 이 주석을 사용하면 애플리케이션 수명주기 동안 모든 사람이 액세스 할 수있는 하나의 컨테이너를 만들 수 있습니다.

+0

안녕하세요 앤디, 귀하의 의견에 감사드립니다, 거기에 몇 시간을 보냈습니다 마침내 나는 디버그 창에 null 값을 표시하지만, 실제로는 주입 프록시에 대한 이클립스에 속아 찾아. 값은 오랜 시간 동안 거기에 있습니다 :) – Hongda

+1

좋은 당신이 당신의 문제를 해결있어 :) –

관련 문제