EJBs mit regulären java-Klassen. Zu instanziieren versucht, eine stateless EJB
Ich habe ein großes web-Projekt in Java EE 6 so weit alles funktioniert Super.
Nun bin ich das hinzufügen einer neuen Klasse, nimmt twitter-Informationen an und gibt einen string zurück. So weit die Saiten wurden extrahiert aus der JSON-Datei aus twitter und bereit sind, beibehalten werden in meiner Datenbank. Mein problem ist, ich bin mir nicht sicher, wie Sie Sie zum weitergeben von Informationen aus dem EJB, die normalerweise behandelt alle meine Datenbank-Aufrufe. Ich verwende JPA und haben eine DAO Klasse, die Manager-Datenbank zugreifen. Ich habe bereits eine Methode, die es für updateDatabase(String)
. Ich möchte in der Lage sein zu rufen updateDatabase(String)
aus der Klasse, die strings hinzufügen, aber ich weiß nicht, ob es die gute form zu instanziieren Sie ein stateless bean so. Normalerweise werden Sie injizieren Bohnen und rufen Sie dann nur auf Ihre Klasse Namen für den Zugriff auf deren Methoden. Ich könnte vielleicht auch versuchen und auf die twitter-string generieren von Klassen aus dem inneren des EJB-aber dann hätte ich zu instanziieren und es Durcheinander mit main () - Methode ruft für die Ausführung. Ich bin mir nicht wirklich sicher, wie dies zu tun. Jetzt meine Twitter konsumieren Klasse ist nur ein POJO mit einer main-Methode. Für einige Grund, warum einige von der Bibliothek Methoden nicht funktionieren, die außerhalb der Haupt-im Gesicht IOUtils () - API direkt sagt "Instanzen sollten NICHT konstruiert werden, in der standard-Programmierung".
Also auf einer höheren Ebene-bottom-line, ich bin nur zu Fragen, wie POJO ' s sind in der Regel "mixed" in eine Java-EE-Projekt, wo die meisten Ihre Klassen EJBs und servlets.
Edit: das oben scheint verwirrend für mich nach dem Wiederlesen also werde ich versuchen, um es zu vereinfachen. im Grunde habe ich eine Klasse mit einer main-Methode. Ich möchte meine EJB-Klasse, mit der Datenbank access und rufen Sie es updateDatabase(String)
- Methode, und übergeben Sie einfach in den string. Wie sollte ich das tun?
Edit: So sieht es aus, wie eine JNDI-lookup und Teilfolge Referenz ist der bevorzugte Weg, dies zu tun, anstatt die Instanziierung der EJB direkt?
Edit: diese Klassen sind alle in der gleichen web-Projekt. Im gleichen Paket. Ich konnte injizieren ein oder konvertieren Sie die POJO, EJB. Aber die POJO hat eine main-Methode und einige der library-Dateien, möchte nicht instanziiert werden, so läuft es im wesentlichen scheint die beste option.
Mein main-code:
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");
}
}
Ich bin auch immer ein java.lang.NullPointerException
irgendwo um rssbean.updateDatabase("twitterText");
Ok, der Grund, warum, EJB null ist, ist wahrscheinlich, weil die Treiber-Klasse ist keine container-Klasse verwaltet. Dies sollte nur funktionieren, wenn die Fahrer der Klasse application entry-point-Klasse (das ist der einzige Weg, können Sie Spritzen EJB auf statisches Feld). Aber Sie sagte, dass dies ist eine web-Anwendung. Also, wo aus rufst du Treiber.main()? Jedenfalls, wenn Sie wirklich brauchen, um haben, dass code in einer statischen Methode (vorausgesetzt, es ist nicht der entrypoint), sehe ich entweder JNDI-lookup oder Umgestaltung von code factory-pattern, um zu injizieren, die Instanz oder etwas entlang jenen Linien.
Ich war nur mit der main-Methode als eine Methode zur Untersuchung der Vorgänge. Brauche ich nicht unbedingt es für die web-Anwendung. Obwohl ich nicht sicher bin, was Mus ich würde zum auslösen der Operationen, um Daten aus der URL und dann das hinzufügen in die Datenbank. Ich bräuchte eine Art automatische Ausführung.
Ah, aber das ist sehr wichtige information, das ist, warum ich fragte, wie Sie diese ausführen. Ich bin mir nicht wirklich sicher, was Ihre Nutzung Fall ist, aber wenn Sie die automatische Ausführung für Ihr logic, verwenden Sie den \@Schedule-annotation. Oder MDB. Oder etwas vollkommen anderes. Aber für diese zu arbeiten, Sie kann nicht laufen, nur diese mit Java SE und werfen \@EJB an. Mehr info hier: stackoverflow.com/questions/1862445/...
Sie haben die Verwendung von JNDI für, die, richtige. Erhalten Sie null-pointer, korrigieren. Zeitplan für die ejb-timer-service, das ist für die automatische Ausführung, die Sie gefragt haben. Wenn Sie gehen, um ausführen Ihre Twitter-Klasse von sagen wir einer JSF-controller (welche wird also ein verwaltetes Objekt, so genannte backing-bean), dann können Sie wandeln es in EJB injizieren Sie die DAO-EJB etc. und du bist fertig. Ansonsten, JNDI verwenden.
InformationsquelleAutor Randnum | 2011-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die POJO als stateless EJB, es ist nichts falsch mit diesem Ansatz.
Aus der wikipedia: EJB ist ein Serverseitiges Modell, kapselt die business-Logik einer Anwendung.
Ihre POJO Klasse, die einen web service nutzt, so führt es eine business-Logik für Sie.
EDIT > Nach dem Lesen Ihres Kommentars, werden Sie beim Zugriff auf ein EJB von außerhalb der Java-EE-container? Denn wenn nicht, dann können Sie injizieren Ihre EJB in einer anderen EJB (HABEN Sie zu Staatenlosen, die beide von Ihnen)
Ich verstehe immer noch nicht, wo die main-Methode ist. Sie konnte Spritzen die EJBs oder so. Das hängt wirklich von denen, die Methode auf Ihrem Twitter-pojo aufgerufen wird. Du könntest @Inject daoClass in den Twitter-bean und rufen die Methode
Ah sorry, es gibt eine main-KLASSE. Es ruft die Twitter-Klasse? Wenn dem so ist, würde ich die Twitter-class EJB injizieren Sie es in die main-Klasse. Und dann entweder injizieren Sie Ihr DAO in Twitter oder Haupt -, hängt von Ihrer software-Architektur. Wie auch immer, Sie wissen wahrscheinlich, wo ich mit diesem gehe.
Ich habe versucht, die Injektion der Datenbank Zugriff auf EJB in meine string-building Klasse, die die main-Methode. das problem ist, dass da alle von meinem code in dieser Klasse wird in main Sie mag es nicht, verweisen auf die EJB aus einem statischen Kontext. Ich könnte versuchen, indem Sie die statische Injektion, nehme ich an
Das problem ist man kann nicht eine Referenz injiziert Klasse von Main. Es möchte, dass es eine statische Klasse.
InformationsquelleAutor Tomáš Plešek
Sollten Sie verwenden
InitialContext#lookup
Methode, um EJB-Referenz, die aus einer application-server.Zum Beispiel:
Beachten Sie jedoch, dass die ejb-name für die Suche verwendet werden können Hersteller-spezifisch. Auch, EJB 3.1 Einführung in das Konzept von portable JNDI-Namen die Arbeit sollte für jeden application server.
Ehrfürchtige Antwort!
InformationsquelleAutor jFrenetic
Wenn Sie ein eigenständiges Programm, dass die Wünsche der Zugriff auf eine EJB-haben Sie ein paar Optionen.
Ist einfach JNDI verwenden, um die EJB. Die EJB müssen über eine Remote-Schnittstelle, und konfigurieren Sie die JNDI-Teil für Sie container, sowie ein spezieller container Gläser in Ihrer stand-alone Anwendung.
Andere Technik ist die Verwendung des Java-EE-Artefakt, bekannt als die "client-Anwendung". Hier gibt es einen container-Anbieter-wrapper für die Klasse, aber es stellt eine Laufzeit-Umgebung, die sehr ähnlich zu laufen, die Klasse innerhalb des Containers, insbesondere Sie kommen so Sachen wie EJB-Injektion.
Du app läuft immer noch in einer separaten JVM, so dass Sie noch brauchen, um Referenz Remote-EJBs, aber die app-client-container behandelt eine Reihe von der Kessel-Platte in Ihre erste app mit dem server verbunden. Auch dies, während ein Java-EE-Artefakt, ist auch der container abhängig ist, wie zum konfigurieren und starten einer app-client-Anwendung.
Schließlich gibt es im Grunde wenig Unterschied, wie ein POJO-Interaktion mit der EJB-container diese Weise im Gegensatz zu einer POJO-Bereitstellung im container. Die Schnittstelle ist immer noch eine Frage der EJB injiziert (leichter gemacht, in Java EE 6 als zuvor) oder sucht sich ein Verweis über JNDI. Der einzige wesentliche Unterschied ist, dass ein POJO-Einsatz in den container verwenden können, eine Lokale Schnittstelle, anstatt der Fernbedienung.
Wenn Sie nicht brauchen, die Transaktions-Fähigkeiten, oder die anderen EJB lifecycle/interceptor-Funktionen, die dann nur machen es zu einem POJO und bewegen auf. Es ist nicht so, dass EJBs, die besonders teuer sind, oder nicht, aber wenn "neue TweetPojo()" macht den job, gehen Sie einfach mit.
ja, ich brauche nur, um es in die Datenbank zu tun, dass ich ot gehe durch eine EJB enthält die Methoden für den Datenbankzugriff. Andere Klassen und servlets verwenden Sie diese EJB-also ich glaube nicht, ich kann nur konvertieren Sie es in ein POJO.
Es kann ein einfaches pojo, ruft die EJB-wie alles andere auch. Wenn es in der web-app, schauen Sie sich den originalen EJB via JNDI und rufen Sie diese Methoden.
InformationsquelleAutor Will Hartung