我有一个Java EE 6中的大型Web项目,到目前为止一切都很好。将EJB与常规的Java类一起使用。试图实例化一个无状态的EJB
现在我添加一个接收twitter信息并返回一个字符串的新类。到目前为止,字符串已经从twitter的JSON文件中提取出来,并准备好保存在我的数据库中。我的问题是我不知道如何从通常处理我所有数据库调用的EJB传递信息。我正在使用JPA并拥有一个DAO类,管理员可以访问所有数据库。我已经有一个方法updateDatabase(String)
。我希望能够从具有要添加的字符串的类中调用updateDatabase(String)
,但我不知道是否可以像这样实例化无状态bean。通常情况下,你注入bean,然后调用他们的类名来访问他们的方法。我也可以试着从EJB内部引用生成类的twitter字符串,但是我必须在那里实例化它,并混淆main()方法调用来执行。我不确定如何做到这一点。现在我的Twitter消费类只是一个主要方法的POJO。出于某种原因,某些库方法在面向IOUtils()API的主体之外不起作用,直接说“实例不应该在标准编程中构建”。
因此,在更高层次的底线上,我只是问POJO如何通常“混合”到Java EE项目中,其中大多数类都是EJB和servlet。
编辑:上面在重读后让我感到困惑,所以我会尽量简化它。基本上我有一个主要方法的类。我想调用处理数据库访问的EJB类,并将其称为updateDatabase(String)
方法,并传入字符串。我应该怎么做?
编辑:所以它看起来像一个JNDI查找和子序列引用是这样做的首选方式,而不是直接实例化EJB?
编辑:这些类都在同一个web项目。在同一个包中。我可以注入一个或将POJO转换为EJB。然而,POJO确实有一个主要的方法,并且一些库文件不喜欢被实例化,所以在main中运行它似乎是最好的选择。
我的主要代码:
public class Driver {
@EJB
static RSSbean rssbean;
public static void main(String[] args) throws Exception {
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("", ""));
}
///////////////end auth code/////////////////////////////////end
URL twitterSource = new URL("http://search.twitter.com/search.json?q=google");
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.substring(urlContents.indexOf('s')));
JSONObject jsonObject = resultsArray.getJSONObject(0);
String twitterText = jsonObject.getString("text");
rssbean.updateDatabase("twitterText");
}
}
我也得到一个java.lang.NullPointerException
地方约rssbean.updateDatabase("twitterText");
你不要创建一个EJB实例。永远。这是Conainer处理的事情。另一方面,你可以做的是在一个方法上放一个PostConstruct注解并在那里执行某些操作(而不是构造函数),但这与你的问题无关 –
好吧,EJB为空的原因可能是因为驱动程序类不是容器管理类。这应该只在Driver类是应用程序入口点类时才有效(这是您可以在静态字段中注入EJB的唯一方法)。但是,你说这是一个Web应用程序。那么你从哪里调用Driver.main()?无论如何,如果你确实需要在静态方法中使用该代码(假设它不是入口点),那么我会看到JNDI查找或者在工厂模式中重构代码,以便沿着这些行注入实例或其他东西。 –
我只是使用主要方法来测试操作。我不一定需要它为Web应用程序。虽然我不确定使用什么机制来触发从URL获取数据然后添加到数据库的操作。我需要某种自动执行。 – Randnum