2011-12-12 3 views
0

나는 이와 유사한 질문을 여기에했습니다 : Best way to interact with EJBs in Java EE 응답이 좋았지 만, 여전히 찾고있는 결과를 얻지 못하고 있습니다. @PostConstruct 주석을 추가하고 주 클래스를 관리 빈으로 변환하여 주입을 사용할 수있을지라도 EJB는 여전히 호출되지 않습니다. 내가 가까이 있다고 생각하지만 Java EE 및 EJB와 관련된 몇 가지 기본 개념을 아직 파악하지 못하고 있습니다. 나는이 일을하기 위해 일종의 타이머 이벤트를 사용해야 할 수도 있다고 생각한다.EJB가 호출되지 않고 실행되지 않음

또 다시 내 문제는이 클래스를 실행하는 동안이 클래스를 한 번 이상 실행해야한다는 것입니다. URL에서 트위터 피드 결과를 얻고, 내용을 배열로 파싱 한 다음 첫 번째 값을 데이터베이스에 추가합니다. 데이터베이스 관리는 다른 EJB를 통해 수행되므로이 ​​클래스에 액세스 할 때 일종의 주입을 사용해야한다. 원래 코드를 테스트하는 주요 메소드를 만들었지 만 정규 Java 클래스에서 EJB 메소드를 주입하고 호출하려고했기 때문에 Null 참조 예외가 발생했습니다.

@ManagedBean 

public class Driver { 

@EJB RSSbean rssbean; 

@PostConstruct 
public void initURL() throws IOException, JSONException{ 

    System.setProperty("http.proxyHost", "proxya..com"); 
    System.setProperty("http.proxyPort", "8080"); 
    /////////////auth code///////////////auth code///////////////// 
     String username = System.getProperty("proxy.authentication.username"); 
     String password = System.getProperty("proxy.authentication.password"); 
     if (username == null) 
     { 
      Authenticator.setDefault(new ProxyAuthenticator("s", "w")); 
     } 
    ///////////////end auth code/////////////////////////////////end 

    URL twitterSource = new URL("http://search.twitter.com/search.json?q=news"); 
    ByteArrayOutputStream urlOutputStream = new ByteArrayOutputStream(); 

       IOUtils.copy(twitterSource.openStream(), urlOutputStream); 
       String urlContents = urlOutputStream.toString(); 
       JSONObject thisobject = new JSONObject(urlContents); 
       JSONArray names = thisobject.names(); 
       JSONArray asArray = thisobject.toJSONArray(names); 
       JSONArray resultsArray = thisobject.getJSONArray("results"); 

       JSONObject(urlContents.trim()); 

      JSONObject jsonObject = resultsArray.getJSONObject(0); 

      String twitterText = jsonObject.getString("text"); 

      System.out.println("Calling rssbean from Driver"); 
      **rssbean.updateDatabase("twitterText");** 
       }} 

rssbean.updateDatabase와 결론이 업데이트가 데이터베이스에 지속 얻을에 대해 실행해야 할 것입니다 :

여기에 관리 콩 PostConstruct의 주석 내 새로운 코드입니다.

+0

'@ Startup'이 @ManagedBean과 함께 작동하는지 모르겠습니다. – Thomas

+0

사람들을 혼란스럽게하지 않도록 질문에서 제거하겠습니다. 나는 그 특수한 주석을 달거나, 그리고 그 주석을 사용하지 않고 시도해 왔으며 결과에 영향을 미치지 않았다. – Randnum

+0

어떻게 든 콩을 가져 옵니까? 그렇지 않으면 문제가 될 수 있습니다. '@ Startup'은 bean이 시작 시간에 (자동으로) 초기화되지만'@ Singleton' 빈에서만 작동하는 것처럼 보입니다. – Thomas

답변

2

@Stateless 또는 @Stateful (사용/필요에 따라 다름)을 추가하고 @ManagedBean을 제거해야합니다. @Stateful이라면 Serializeable 인터페이스도 반드시 구현해야합니다.

+0

이 변경 작업을했지만 실제로이 Driver 클래스를 호출하는 것이 아무 것도 없다고 생각합니다. 그것은 사용자 이벤트에 묶여 있지 않으므로 실행을 요구하는 것은 없습니다. 아마 @postconstruct가 어떻게 든 백그라운드에서 실행되도록 만들 것이라고 생각했지만 실제로 필요한 것은 타이머 클래스이거나 서블릿과 함께 첫 페이지로드에 연결하는 것입니다. – Randnum

+0

@PostConstruct는 객체가 생성 된 후에 (그리고 모든 종속 리소스가 주입되도록) 호출 될 때만 호출되는 메서드입니다. 그것은 단지 콜백 일 뿐이다. 나는 당신이 그것의 목적을 잘못 생각했다고 생각한다 : =) – LuckyLuke

+0

아마도 :/나는 index.xhtml 페이지를 실행하고 있어도 서버에서 프로젝트를 실행할 때마다 실행될 것으로 생각한다. 나는 글래스 피쉬가 필요할 때까지이 EJB를 무시할 수도 있다고 생각한다. 그것은 확실히 무시되고 있기 때문입니다. – Randnum

관련 문제