2011-12-12 47 views
0

我已经在这里问了一个类似的问题:Best way to interact with EJBs in Java EE而且响应非常好,但是我仍然没有得到我期待的结果。尽管我添加了@PostConstruct注释并将主类转换为托管bean,但仍然没有调用EJB,因此我可以使用注入。我认为我很接近,但我仍然没有掌握一些涉及Java EE和EJB的基本概念。我想我可能不得不使用某种计时器事件来完成这项工作。EJB永远不会被调用,不会执行

同样,我的问题是,我希望这个类在运行时至少执行一次。它从URL获取推送结果,将内容解析为数组,然后将第一个值添加到数据库。数据库管理通过另一个EJB来完成,所以我必须使用某种注入来访问这个类。最初我创建了一个测试代码的主要方法,但是我得到了空引用异常,因为我试图从一个普通的java类中注入并调用EJB的方法。

这是我的新代码与托管豆类和PostConstruct注释:

@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的底线是什么需要执行的更新得到持久化到数据库。

+0

我不确定'@ Startup'与'@ ManagedBean'结合使用。 – Thomas

+0

我会从问题中删除它,以免分散人们的注意力。我已经尝试过,没有特定的注释,但没有影响结果。 – Randnum

+0

你以某种方式检索bean吗?如果不是那可能是问题。 '@ Startup'会导致bean在开始时自动初始化,但似乎只适用于'@ Singleton' bean。 – Thomas

回答

2

您必须添加@Stateless@Stateful(根据您的使用/需要),然后删除@ManagedBean。如果你使它@Stateful一定要实现Serializeable接口。

+0

我做了这个改变,但我认为问题是没有什么是真的调用这个Driver类。它没有绑定到用户事件,因此没有要求它执行。我认为@postconstruct可能以某种方式在后台运行,但我认为我真正需要的是某种类型的计时器类,或者以某种方式将它与第一个加载servlet的页面绑定。 – Randnum

+0

@PostConstruct只是在创建对象之后调用的一个方法(并且注入了所有依赖资源)。这只是一个回调。我认为你得到了错误的目的:=) – LuckyLuke

+0

也许:/我想我也期待它运行,只要我在服务器上运行项目,即使我只是运行index.xhtml页面。我认为Glassfish可能会忽略这些EJB,直到他们需要。因为它肯定被忽略。 – Randnum

相关问题