JSF Wo ist die Implementierung?

tsitra

Bekanntes Mitglied
Hallo allerseits,

in einer JSF Web-Anwendung finde ich
folgende Aufrufe:

Testklasse.TestMethode1();
...
objTestklasse.merge();
...
objTestklasse.persist();

Die Eclipse IDE meldet sinnigerweise, dass TestMethode1(),
merge() und persist()
unbekannt sind, da es sie tatsächlich nicht in "... class Testklasse" gibt!

Eine Regel in Java besagt, dass nur statische
Methoden auf dem Klassennamen aufgerufen werden.
Wie erwähnt gibt es TestMethode1() überhaupt nicht in Testklasse,
also weder als static oder als nicht-static.

Wird das irgendwie zur Compilezeit oder Laufzeit erst festgelegt,
was mit TestMethode1() merge() und persist() genau gemeint ist
und wie diese implementiert sind.

Wie komme ich an die Implementierung von TestMethode1() ran?

Danke für Hilfe und Hinweise,
Viele Grüße,
tsitra
 

stg

Top Contributor
Woher soll hier jemand wissen, was du da für eine Anwendung hast, wie der Code ausschaut, wie sie aufgebaut ist etc...?

Allgemein: In Netbeans gibt es eine Art "go to source"-Funktionalität, mit der man im Quelltext hin- und hernavigieren kann. Eclipse kann das sicherlich auch.
 

HarleyDavidson

Bekanntes Mitglied
Allgemein: In Netbeans gibt es eine Art "go to source"-Funktionalität, mit der man im Quelltext hin- und hernavigieren kann. Eclipse kann das sicherlich auch.

Korrekt. In Eclipse wie auch in Netbeans: Halte die STRG-Taste gedrückt und fahre mit der Maus über den Methodenaufruf. Der verändert sich dann in einen Link. Wenn du draufklickst, springt die IDE automatisch zu der Deklaration.
 

tsitra

Bekanntes Mitglied
...Halte die STRG-Taste gedrückt und fahre mit der Maus über den Methodenaufruf. Der verändert sich dann in einen Link. ...

Nein. Bei mir verändert sich der Methodenaufruf nicht in einen Link!

Also:
In meiner IDE Eclipse Juno [Eclipse Java EE IDE for Web Developers.
Version: Juno Service Release 2Build id: 20130225-0426]
wird bei

Testklasse.TestMethode1();

"TestMethode1();" rot unterstrichen
und ein tootip meldet (wenn ich den cursor darauf bringe):

"The method TestMethode1() is undefineded" for the type Testklasse
1 quick fix available:
Create method 'TestMethode1()' in type 'Testklasse' "
(* letzteres als link ! *)

Mit Strg und Mauszeiger diesen unterstrichenen Aufruf in einen link
zu verwandeln gelingt mir nicht.

Der link des quick fix funktioniert und wenn ich den anklicke wird sinnigerweise
eine static TestMethode1()' in Testklasse neu nur als Schablone gebaut.

Was interessant bei der Sache ist, ist dass die gesamte web-Anwendung soweit gut funktioniert und der Tomcat auch eine Meldung, die mit System.out.println("...") unmittelbar vor und hinter "Testklasse.TestMethode1();" plaziert ist, auf der Konsole ausgibt.
Das sind für mich klare Belege, dass der Aufruf funktioniert und dass die Implemtierung von
TestMethode1() da ist, aber wo?

Viele Grüße

tsitra
 
Zuletzt bearbeitet:

stg

Top Contributor
Dann nochmal meine Frage:

Woher sollen wir das wissen?

Das soll gar nicht spöttisch oder sonst was sein, sondern ist wirklich eine ernstgemeinte Frage. Du postest nur völlig zusammenhangslos zwei Zeilen Code, wenn denen du glaubst, dass sie fehlerhaft seien. Liefer ein (lauffähiges) Minimalbeispiel ab, und dann können wir gerne mal schauen.
Wenn du die Möglichkeit hast die ganze App zu teilen, dann würde ich vielleicht auch mal einen Blick drauf werfen, aber mit den wenigen Infos, die du uns hier gibst, KANN man dir NICHT helfen... :noe:
 
Zuletzt bearbeitet:

tsitra

Bekanntes Mitglied
Dann nochmal meine Frage:

Woher sollen wir das wissen?

Das soll gar nicht spöttisch oder sonst was sein, sondern ist wirklich eine ernstgemeinte Frage. Du postest nur völlig zusammenhangslos zwei Zeilen Code, wenn denen du glaubst, dass sie fehlerhaft seien. Liefer ein (lauffähiges) Minimalbeispiel ab, und dann können wir gerne mal schauen.
Wenn du die Möglichkeit hast die ganze App zu teilen, dann würde ich vielleicht auch mal einen Blick drauf werfen, aber mit den wenigen Infos, die du uns hier gibst, KANN man dir NICHT helfen... :noe:


Hallo,
und Danke für die Rückmeldung.

Ich stellte u.a. fest, dass eine "go to source"-Funktionalität" wie sie HarleyDavidson für Eclipse
ankündigte/versprach nicht vorhanden ist.:noe:

Ich schätze meine Java Kenntnisse als fortgeschritten ein, jedoch habe ich anfangs bewusst lange ohne IDE gearbeitet, sodass mein "know-how" bei NetBeans, und mehr noch bei Eclipse, lückenhaft
sind. Eventuell müsste ich da noch was konfigurieren oder ein plugin installieren oder... !? :bahnhof:

Wie soll ich ein Minimalbeispiel entwickeln, in dem so was wie "Testklasse.TestMethode1();"
mit "TestMethode1() is undefined" angemahnt wird, der Code aber dann dennoch kompiliert. läuft und funktioniert.???:L

Ich sehe das nicht so, dass es völlig zusammenhangslos ist oder zu wenig Information, weil ich erstens klar beschreibe, dass meine IDE einen Fehler, nämlich "TestMethode1() is undefined", durch rotes Unterstreichen meldet, was auch nachvollziehbar ist, da es sie tatsächlich in "Testklasse" nicht gibt, aber dennoch diese JSF-web Anwendung kompiliert wird und lauffähig ist und diese Codezeile "Testklasse.TestMethode1();" auch ausgeführt wird.:pueh:

Jeder, der in Java mindestens leicht fortgeschritten ist, weiß, dass, wenn Testklasse eine
Klasse ( class Testklasse) ist, der Ausdruck "Testklasse.TestMethode1()" bedeutet, dass hier eine static Methode, nämlich "TestMethode1()" auf dem Klassennamen "Testklasse" aufgerufen wird.

Was mich eben sehr verwundert und warum ich auch hier frage ist, dass in der "class Testklasse"
überhaupt keine Methode "TestMethode1()" definiert ist.
Wieso kompliert und läuft das überhaupt?

Man könnte meinen, es gäbe noch eine zweite "Testklasse" in der die TestMethode1() definiert ist,
aber das ist in Java nicht erlaubt.

Es ist eine für mich sehr merkwürdige Angelegenheit und ich ahne, dass JSF irgendwelche Techniken
nutzt, in denen erst später (zur Kompilezeit oder Laufzeit) die Zeile "Testklasse.TestMethode1();" zu einem lauffähigen Code generiert wird.

Viele Grüße
tsitra
 

stg

Top Contributor
Jeder, der in Java mindestens leicht fortgeschritten ist, weiß, dass, wenn Testklasse eine
Klasse ( class Testklasse) ist, der Ausdruck "Testklasse.TestMethode1()" bedeutet, dass hier eine static Methode, nämlich "TestMethode1()" auf dem Klassennamen "Testklasse" aufgerufen wird.

Derjenige würde sich aber auch an CodeKonventionen halten und nicht solche bescheuerten, nichtssageneden Namen in einer (offenbar im produktivbetrieb) laufenden Anwendung verwenden.

Also, entweder du schaust tatsächlich in der falschen Klasse, weil es etwa in mehreren Pakten eine "Testklasse" gibt, oder Testklasse ist an dieser Stelle in Wirklichkeit ein Objekt eines ganz anderen Typs (ja, dann würde man den Namen normalerweise klein schreiben aber der Methodenname ist ja ebenfalls groß geschrieben...), oder die Methode stammt aus einer Oberklasse, die von Testklasse erweitert wird, oder .... was fällt einem denn noch Lustiges ein? :bahnhof:

Also, womöglich gibt es einfach irgendwelche Namenskonflikte, mit denen Eclipse nicht zurecht kommt, der Compiler aber schon. Sollte es jedoch tatsächlich ein Fehler im Quellcode sein, dann würde der Code - auch wenn es sich um eine WebAnwendung handelt - gar nicht erst kompilieren. Das sind und bleiben ja trotzdem "stinknormale" .java-Dateien, die anschließend zu .class-Dateien kompiliert werden. Von wo aus diese Klassen nun angesprochen und benutzt werden, ist denen ja so ziemlich egal....
Wenn es nirgendwo in der gesammten Applikation eine solche Methode gibt, sie aber trotzdem aufgerufen wird, dann ist das wohl eher ein Fall für Akte X, als für dieses Forum :eek:



Wie soll ich ein Minimalbeispiel entwickeln, in dem so was wie "Testklasse.TestMethode1();"
mit "TestMethode1() is undefined" angemahnt wird, der Code aber dann dennoch kompiliert. läuft und funktioniert.???:

Zum Beispiel, in dem du deine WebAnwendung hernimmst, und alles rausschmeißt, was nichts mit dem Problem zu tun hat.
 

tsitra

Bekanntes Mitglied
Hallo,
schön nochwas mitgeteilt zu bekommen.:)

Derjenige würde sich aber auch an CodeKonventionen halten und nicht solche bescheuerten, nichtssageneden Namen in einer (offenbar im produktivbetrieb) laufenden Anwendung verwenden.
Da gehst Du von einer falschen Annahme aus, denn diese Namen habe ich mir als Beispiel
ausgedacht.
Übrigens habe ich dabei übersehen, dass der originale Methodennamen mit einem Kleinbuchstaben
beginnt. Sorry, dass ich hier die CodeKonventionen missachtet habe :oops:

Was vor (links vom...) dem Punkt steht, ist mit Sicherheit keine Objektreferenzvariable
(kurz: kein Objekt) sondern tatsächlich ein Klasse-Namen, also eine Klasse.
Ich habe das gesamte Projekt durchsucht und diesen Klasse-Namen nur mit Großbuchstaben beginnend gefunden.
Genau deshalb bleibt die Sache erstmal noch sehr seltsam.:bahnhof:

Zum Beispiel, in dem du deine WebAnwendung hernimmst, und alles rausschmeißt, was nichts mit dem Problem zu tun hat.

Nicht einfach, weil das Problem ja darin besteht, dass ich etwas vermisse und
beim "rausschmeissen" kann ich mir nie sicher sein, ob das relevant ist oder nicht, was ich gerade
"rausschmeisse".
Dennoch wäre es wohl eine Chance die Sache herauszubekommen.
Aber das kann sehr aufwändig werden, desahlb frage ich hier ;-)

Hinweis:
In dieser WebAnwendung wird offenbar aspektorientierte Programmierung und
dependency Injection angewandt

Gute Nacht,
tsitra
 

Tobse

Top Contributor
Compiliert denn das Projekt? Ich denke mal eher nicht... vielleicht fehlt dir auch einfach ein teil vom Sourcecode?

Btw.: Ich kenne mich mit Reflections nicht genau aus, aber man müsste da auch noch Methoden definieren können.
 

tsitra

Bekanntes Mitglied
Hallo,
Hinweis:
In dieser WebAnwendung wird offenbar aspektorientierte Programmierung und
dependency Injection angewandt. ...

Mit diesem Hinweis von letzter Nacht war ich nah dran!

In der Datei "TestKlasse_Roo_Jpa_ActiveRecord.aj" (die nat. zu "meiner" web-Anwendung gehört) habe ich die Implementation von
testMethode1() in dieser ungewöhnlichen Schreibweise gefunden :toll:,worin dann
eine DB-Anfrage initiiert wird:
--------------------------------------
// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO.
...

public static List< TestKlasse> TestKlasse.testMethode1() {
return entityManager().createQuery("SELECT o FROM TestKlasse o", TestKlasse.class).getResultList();
}
...
----------------------------------------
Die Verwendung von SPRING ROO verursacht also diese oben beschriebenen merkwürdigen "Phänomene" in Eclipse!
Nochmals Danke für das Interesse an meinem Problem!
Ich werde dieses Thema nun als erledigt markieren.
Bis zum nächsten Mal.
Viele Grüße
tsitra
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JSF 2.2 - Implementierung Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben