Java - Eclipse löst Funktionsparameter falsch auf

bitmuncher

Senior-Nerd
Ich ärgere mich gerade mal wieder mit Eclipse und Java rum (wie ich diesen Schrotthaufen, der sich IDE nennt, hasse *grummel* ... das musste mal gesagt werden X( ).

Problem ist folgendes... Ich habe eine Funktion innerhalb eines Wowza-Moduls, die einen Call an eine Flash-Applikation absetzt.

Code:
public class BasicModule extends ModuleBase{
  public void onConnect(IClient client, RequestFunction function, AMFDataList params)
  {
    ...
    client.call("setUserData", null, user_data, app_user_id,app_id);
    ...
  }
}

Theoretisch geht das auch so, nur behauptet Eclipse, dass die Parameter für die Funktion 'call()' nicht korrekt seien:
Code:
Severity and Description	Path	Resource	Location	Creation Time	Id
The method call(String, IModuleCallResult, Object[]) in the type IClient is not applicable for the arguments (String, null, String, String, String)	toksta/modules	BasicModule.java	line 154	1218480125666	34

call() wiederum ist wie folgt definiert:

Code:
public void call(String handlerName, IModuleCallResult resultObj, Object[] params)

Dabei kann handlerName eine beliebige Funktion sein, die zu einem NetConnection-Objekt gehört (in diesem Fall also 'setUserData'). resultObj kann 'null' sein, wenn die Rückgabe keine Rolle spielt. 'params' kann eine variable Liste von Argumenten für die im NetConnection-Objekt aufgerufene Funktion sein. Die Werte dieser Liste werden automatisch in ein AMFData-Objekt ge'wrapped'. Der oben genannte Funktionsaufruf ist also absolut korrekt.

Wie kann ich nun aber auch Eclipse beibringen, dass diese Parameter nicht 'String, null, String, String, String' sind, sondern dass dies den erwarteten Parametern entspricht?

Oder halt immernoch mein altes Problem... wie bekomme ich Eclipse-Projekte sauber in JStudio eingebunden? Ich denke, dass sich das Problem damit vermutlich von allein lösen würde.
 
Ähm, jetzt mal langsam. Ich zähle bei der Definition von call 3 Parameter. Bei übergibst aber 5. Das kann nicht gehen. Wenn user_data, app_user_id, app_id in das Object-Array sollen, dann würd ich die da halt auch reinpacken (new Object[]{user_data, app_user_id, app_id} als 3. Parameter).

Übrigens, ich und meine 60 Kollegen arbeiten jeden Tag mit Eclipse, auch in früheren Firmen hab ich ausschließlich mit Eclipse gearbeitet. Privat hab ich auch mal andere IDEs ausprobiert und bin immer ganz schnell wieder zu Eclipse zurück.

Gruß odigo
 
Das kann sehr wohl gehen. Nur Eclipse will das nicht akzeptieren. Der Code läuft ja so auf unseren Servern. Leider wurde das Projekt ursprünglich mit Eclipse entwickelt, so dass ich quasi gezwungen bin es weiter mit Eclipse zu bearbeiten um mich nicht erst in das Build-System einarbeiten zu müssen. Das Beispiel in der Doku vom WowzaMediaServer ist ja auch so gemacht:

Code:
call
public void call(String handlerName,
         IModuleCallResult resultObj,
         Object[] params)

Call client method/handler. You can call any method/handler attached to NetConnection object. Such as
netConnection.myFunc
Call Client Handler Method With Result Object

Code:
  IClient client;
  class ReturnObj implements IModuleCallResult
  {
            public void onResult(IClient client, RequestFunction function,
                        AMFDataList params)
            {
                        WMSLoggerFactory.getLogger(null).debug("onResult");
            }
  }
  client.call("onCustomMethod", new ReturnObj(), "param1", 1.2345, false, new Date());
Parameters:
handlerName - handler name
resultObj - if client method returns data this object will receive callback, null if don't care or no return on client
method/handler.
params - variable list of argument. Will be automatically wrapped in AMFData objects

Kurzum: Man kann die Parameter-Liste wie in der Applikation verwendet, als Strings angeben. Das Umwandeln in ein Objekt geschieht automatisch, nur will Eclipse das offenbar nicht begreifen.

Übrigens, mir ist es ziemlich egal womit andere arbeiten. Ich mag Eclipse einfach nicht, da ich ständig mit solchen nicht nachvollziehbaren Fehlern zu kämpfen habe, dass valider Code als fehlerhaft angezeigt wird. Das nervt einfach tierisch. Bei den Projekten, bei denen ich mit JStudio arbeite, habe ich solche Probleme nicht. Ich habe bisher nichts gefunden, wo Eclipse JStudio bei der Java-Entwicklung etwas voraus hätte, eher im Gegenteil.
 
Code:
public class test {

	public static void print(String[] testArr){
		System.out.print(testArr[0]);
	}
	
	public static void main(String[] args) {
	  print("test1", "test2");

	}

}

[odigo@acer291 Desktop]$ javac test.java
----------
1. ERROR in test.java (at line 8)
print("test1", "test2");
^^^^^
The method print(String[]) in the type test is not applicable for the arguments (String, String)
----------
1 problem (1 error)
[odigo@acer291 Desktop]$ java -version
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b05)
Java HotSpot(TM) Client VM (build 1.6.0_02-b05, mixed mode)

Bei mir gehts nicht. Musst wohl eine Java-Version haben die ich nicht kenne. Dann mal viel Glück mit JStudio.

Gruß odigo
 
Wie du unter http://www.wowzamedia.com/resources/WowzaMediaServerPro_ServerSideAPI.pdf (Seite 230) nachlesen kannst, ist das im Wowza aber möglich. Wie bereits gesagt, läuft dieser Code in dieser Form auch bei uns bereits. Hab keine Ahnung, wie die Leute von Wowza das implementiert haben. Ist leider Closed-Source.

Das einzige Problem ist hier also Eclipse, der das als Fehler anzeigt. Und irgendwie muss das ja zu beheben sein, dass er ständig validen Code als Fehler anzeigt. Habe ja ähnliche Probleme auch bei anderen Wowza-Modulen, aber eben nur im Eclipse, während es im JStudio solche Probleme nicht gibt.

Habe die notwendigen Jars natürlich dem Projekt bereits zugefügt. Dass er irgendwelche Jars für die Wowza-API nicht findet, kann also auch nicht die Ursache sein.
 
Kam mir ehrlich gesagt etwas komisch vor: variable Argumenlisten gibts ab Java 5 und sie werden so definiert: method(Type... parameter). Irgendeine andere Methode wäre mir nicht bekannt (was natürlich nichts heißen muss :) ).

Spontan hätte ich darauf getippt, dass Du oder Eclipse das falsche Interface beim Importieren erwischt habt. Kann sein dass es das interne Interface ist aus irgendeinem Package ist, bei dem schon mit Object[] param gearbeittet wird. Kann auch sein, dass die PDF veraltet ist - jedenfalls schaut die Methode laut der Onlinedoku
http://accesscafegroup.com/WowzaMed...odule.IModuleCallResult, java.lang.Object...)
aus und nicht wie in der PDF (oder Deinem Bsp) angegeben.

PS: falls noch ein Workaround benötigt wird:
das sollte äquivalient sein und erstmal keine Änderungen im Interface&Co erfordern
Code:
public int hello(Object ...integers)
	{
		return 2;
	}
oder
public int hello(Object[] integers)
{
blub
}
beide Sachen wären ansprechbar mit:

public void run()
	{

		Object[] myarray=new Object[3];
		myarray[0]=new Integer(2);
                myarray[1]=new Integer(2);
                usw.
		this.hello(myarray);
	}
 
@CDW: Das, was du verlinkt hast, ist doch haargenau das gleiche wie in der PDF. Man beachte dort den Aufruf aus dem Beispiel:

Code:
client.call("onCustomMethod", new ReturnObj(), "param1", 1.2345, false, new Date());

Das ist genau das gleiche wie ein

Code:
client.call("setUserData", null, user_data, app_user_id,app_id);

Siehe auch mein Screenshot:

wowza1.png


Ich hab ehrlich gesagt auch keine Lust jetzt hier rumzudiskutieren, ob der Funktionsaufruf so richtig ist. Bin von diesem Eclipse eh schon angenervt genug. Der Code funktioniert definitiv so, wird auch problemlos so kompiliert. Nochmal... dieses Modul läuft bei uns bereits mit genau diesen Funktionsaufrufen drin. Wenn es nicht möglich wäre, dürften unsere Streaming-Server entsprechend garnicht funktionieren.

Daher stellt sich mir die Frage: Wie bringe ich das Eclipse bei, dass die Parameter automatisch in ein AMFData-Objekt aufgenommen werden? Ich will die Aufrufe nicht ändern, da sie so funktionieren! Es ist nicht so, dass der Code von Eclipse nicht kompiliert werden kann, das geht problemlos. Das einzige Problem ist, dass Eclipse den Code in der "Problems-Box" als Error anzeigt und genau das will ich weghaben, da es mich nervt, wenn da 6 Errors aufgeführt werden, die keine Errors sind und ich jedesmal runterscrollen muss um die richtigen Errors zu sehen.
 
@bitmuncher: der Aufruf ist durchaus korrekt - was mir so komisch vorkam ist die unterschiedliche Definition in beiden Dokumenten:
einmal Object[] und einmal mit Object...
Dass "Object..." nur Syntaxsuggar ist und der Compiler dann intern dafür einfach nur den Array-Code/Collections generiert und Object[] nutzt, dürfte klar sein - nur hilft es Dir wohl nichts.
 
So, hab festgestellt, daß es diesen merkwürdigen Konstrukt wirklich gibt. Ich hab aber auch festgestellt, daß Eclipse nicht meckert. Schau doch mal in den Preferences unter ob "Java" - "Compiler" - "Compiler compliance level" auf 5.0 steht und daß du im Projekt auch eine JDK 1.5 oder höher verwendest.

Gruß odigo
 
Perfekt... "Compiler compliance level" war offenbar das Problem. JDK war schon der richtige (1.5.0). Danke für die Hilfe. :)
 
Zurück
Oben