【发布时间】: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 在启动时(自动)初始化,但似乎只适用于@Singletonbeans。 -
没有调用这个 Driver 类来真正让它执行。我认为将它与某些用户事件联系起来可能是唯一的方法。我有点希望它以某种方式“只是”在启动时在后台运行。
-
正如我所说,你需要使用
@Startup,它只能与@Singleton结合使用。
标签: java jakarta-ee ejb