2014-10-07 1 views
0

나는 named 세션에 매개 변수로 주입하고 설정 한 사용자 세션 속성에 따라 동적으로 dataSet을로드하려고합니다.세션 속성에 따라 데이터를 동적으로로드

namedQuery는 정상적으로 작동하지만 원하는대로 데이터 세트를 가져 오지 못합니다.

세션 속성이 9882 일 때로드 된 데이터 세트는 findAll 쿼리에 해당합니다. 그러나 그 동안에 다른 사용자가 앱에 로그인하고 세션 속성이 4207 인 경우에도 데이터 세트는 여전히 9882와 동일하게 유지되며 이는 데이터 세트가 여전히 findAll 쿼리와 일치 함을 의미합니다. 첫 번째 세션 속성이 4207 인 경우 예상대로 findByPrefDep 쿼리를 사용하지만 해당 4207 사용자 이후에 기록 된 9882 세션 속성에 대해 데이터 세트는 여전히 동일합니다.

@Inject 
private String SessionPrefDep; 

public Collection<T> getItems() { 
    if (items == null) { 
    if (Integer.valueOf(SessionPrefDep) == 4207) { 
     items = this.ejbFacade.findByPrefDep(); 
     } else if (Integer.valueOf(SessionPrefDep) == 9882) { 
      items = this.ejbFacade.findAll(); 
     } 
    } 
    return items; 
} 

원하는 컨트롤을 어떻게 얻을 수 있습니까?

미리 감사드립니다.

----------- 새로운 섹션

생산자 :

@ApplicationScoped 
public class BeanCDI { 

private final String sessionPrefDep = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("xPrefDep"); 

@Produces 
public String SessionPrefDep() { 
    return sessionPrefDep; 
    } 
} 

감사관 :

@Inject 
private Instance<String> SessionPrefDep; 

public Collection<T> getItems() { 

    int sessionId = Integer.valueOf(SessionPrefDep.get()); 

    if ((items == null) && (sessionId == 4207)) { 
     items = this.ejbFacade.findByPrefDep(); 
     System.out.print("****************** findByPrefDep() - sessionId:" + sessionId); 
    } else if ((items == null) && (sessionId == 9882)) { 
     items = this.ejbFacade.findAll(); 
     System.out.print("****************** findAll() - sessionId:" + sessionId); 
    } 
    return items; 
} 

답변

0

CDI에 대해 조사한 후 필자는 문제를 해결하는 데 필요한 것을 다루는 매우 훌륭한 책을 발견했습니다. 필자가 권장하는이 책은 Apress Begining EJB.3.2nd Edition May2013과 10 장에서 찾은 해결책입니다.

변경해야 할 것은 제작자의 CDI 범위뿐입니다. 이렇게하면 문제가 해결되었습니다.

//@ApplicationScoped --> I was wrongly, for my needs, using this scope... 
@RequestScoped 
public class BeanCDI { 

private final String sessionPrefDep = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("xPrefDep"); 

@Produces 
public String SessionPrefDep() { 
return sessionPrefDep; 
} 
} 
1

당신은

@Inject 
private Instance<String> SessionPrefDed; 

//then in your code 
int sesionId = Integer.valueOf(SessionPrepDef.get()); 
을 통해이 작업을 수행 할 수 있습니다

이렇게하면 항상 새로운 가치를 얻어야합니다. . 그러나 그것은 또한 당신이이 객체를 어떻게 만드 느냐에 달려 있습니다. 나는 당신이 생산자들과 만 CDI에 문자열을 주입 할 수 있다는 것을 기억하십시오.

+0

안녕 Petr Mensik! 도와 주셔서 정말 고맙습니다. 지식을 공유해 주셔서 대단히 감사합니다! – jMarcel

+0

당신은 오신 것을 환영합니다! 도움이 되었습니까? –

+0

Petr Mensik, 테스트를 마쳤지 만, 불행히도 작동하지 않았습니다. 세션 ID는 앱에 로그인 한 첫 번째 사용자에 따라 계속 동일합니다. 글래스 피쉬의 추억 속에 아직도 남아 있습니다. 필자가 말했듯이 프로듀서와 삽입 된 매개 변수를 보여주기 위해 코드를 업데이트했습니다. 제발, 제가 실수를하는지보십시오. 감사! – jMarcel

관련 문제