【问题标题】:EJB never being called, not executingEJB 从不被调用,不执行
【发布时间】:2011-12-12 17:21:59
【问题描述】:

我在这里问过一个类似的问题:Best way to interact with EJBs in Java EE 反应很好,但我仍然没有得到我想要的结果。即使我添加了 @PostConstruct 注释并将主类转换为托管 bean 以便我可以使用注入,EJB 仍然没有被调用。我想我已经接近了,但我仍然没有掌握一些与 Java EE 和 EJB 相关的基本概念。我想我可能不得不使用某种计时器事件来完成这项工作。

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

这是我的带有托管 bean 和 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 的底线是需要执行哪些更新才能将更新持久化到数据库中。

【问题讨论】:

  • 我不确定@Startup 是否与@ManagedBean 一起使用。
  • 我会将其从问题中删除,以免分散人们的注意力。我在有和没有那个特定注释的情况下都试过了,它不影响结果。
  • 您是否以某种方式检索 bean?如果不是那可能是问题所在。 @Startup 会导致 bean 在启动时(自动)初始化,但似乎只适用于 @Singleton beans。
  • 没有调用这个 Driver 类来真正让它执行。我认为将它与某些用户事件联系起来可能是唯一的方法。我有点希望它以某种方式“只是”在启动时在后台运行。
  • 正如我所说,你需要使用@Startup,它只能与@Singleton结合使用。

标签: java jakarta-ee ejb


【解决方案1】:

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

【讨论】:

  • 我做了这个改变,但我认为问题是没有真正调用这个 Driver 类。它与用户事件无关,因此没有要求它执行。我认为@postconstruct 可能会以某种方式使其在后台运行,但我认为我真正需要的是某种计时器类,或者以某种方式将其与带有 servlet 的第一页加载联系起来。
  • @PostConstruct 只是一个方法,在创建对象(并注入所有依赖资源)后将调用该方法。这只是一个回调。我认为您的目的是错误的:=)
  • 可能:/ 我想我也希望它在我在服务器上运行项目时运行,即使我只是运行 index.xhtml 页面。我认为 Glassfish 可能会在需要它们之前忽略这些 EJB。因为它肯定被忽略了。
  • 如果您不调用 EJB,它们也不会运行。它与“普通”Java 相同。如果您不创建实例并调用“普通”Java 类的方法,您会期待什么?即使它们在您的项目中,它们当然也不会由它们自己运行:)
  • 我自己正在学习Java EE,所以不知道这是否有什么好的解决方案,但是您可以试试timer API?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多