This blog has moved to
http://blog.matthias-reining.com

Die bestehenden Artikel bleiben vorerst alle bei blogspot. Neue Artikel veröffentliche ich allerdings nur noch auf http://blog.matthias-reining.com

Sonntag, 25. Januar 2009

Struts2 – OGNLException „target is null for setProperty“ auf Stdout

Struts 2.1.6 GA endlich da…

Allerdings wird (immer noch, wie bereits in der Version 2.1.2) eine OGNL Exception ausgegeben wenn man versucht per OGNL (Object Graph Navigation Language) einen Wert zu setzen, der in einer Objekthierarchie liegt (bei der Verwendung des Interfaces ModelDriven).

JSP:

<s:textarea name="projectHistory.description" rows="10"></s:textarea>

StrutsAction:

public class ProfileAction extends BaseAction implements ModelDriven<ObjectA>, Preparable {
//...
@Override
public ObjectA getModel() {
return this.objectA;
}
}
public class ObjectA {
//setter and getter
private ProjectHistory projectHistory;
}
public class ProjectHistory {
//setter and getter
private String description;
}

Erfreulicherweise funktioniert alles! In diesem Beispiel wird der, auf der Website erfasste Wert, korrekt in das Feld objectAàprojectHistoryàdescription (getModel().getProjectHistory.setDescription(String description)) geschrieben.

Folgender Fehler wird dabei ausgegeben:

ognl.OgnlException: target is null for setProperty(null, "description", [Ljava.lang.String;@1a2f5b1)
    at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1651)
    at ognl.ASTProperty.setValueBody(ASTProperty.java:101)
...

expr: projectHistory.description val: [Ljava.lang.String;@1a2f5b1 context: ognl.OgnlContext@14d8bcda root:[com.xyz.ProfileAction@1b071c0, com.opensymphony.xwork2.DefaultTextProvider@fbf51d] value: [Ljava.lang.String;@1a2f5b1

und das auf StandartOut… (!)

Der Code hierfür liegt im XWork Projekt.

package com.opensymphony.xwork2.ognl;
...
public class OgnlValueStack implements ... {

public void setValue(String expr, Object value, boolean throwExceptionOnFailure) {
...
} catch (OgnlException e) {
if (throwExceptionOnFailure) {
e.printStackTrace(System.out);
System.out.println("expr: " + expr + " val: " + value + " context: " + context + " root:" + root + " value: " + value);
String msg = "Error setting expression '" + expr + "' with value '" + value + "'";
throw new XWorkException(msg, e);
} else {
...

Den Stacktrace auf System.out auszugeben und anschließend nochmal eine Info Meldung ist meines Erachtens nicht wirklich schön (und erst recht nicht in einer GA Version).

Klar: ist OpenSource, kann man selber korrigieren… werd ich jetzt auch mal angehen in meinem Projekt, da sonst das Logfile ziemlich hässlich ausschaut. Bevor ich hier mal bei der XWork Community nachfrage, will ich aber hier erst noch etwas tiefer in das Thema eintauchen – vielleicht macht's ja doch irgendwie Sinn und ich bin nur noch ganz dahinter gestiegen ;-)

Dienstag, 20. Januar 2009

Subversion: alte Versionen und Subclipse

Habe gerade ein älteres Projekt innerhalb von Eclipse in Bearbeitung… Ein paar Änderungen durchgeführt. Unit Tests angepasst. Seleniumtests ebenfalls angepasst… Allerdings habe ich das Selenium File mit TortoiseSVN innerhalb der SeleniumIDE commited. à Böses Faul, wie sich anschließend rausstellte…

Die EclipseIDE war passen auf das Projektkonfiguriert und auch mit dem Projekt gezippt eingecheckt (sehr schön ;-), konnte man sofort loslegen). TortoiseSVN ist natürlich recht aktuell auf meinem OS.

Als ich anschließend meine Sourcen in Eclipse einchecken wollte kam folgende Fehlermeldung:

svn: This client is too old to work with working copy... please get a newer Subversion client

Danach geht erstmal gar nichts mehr L. Ok: also neues Subclipse installieren.

Help -> Find and Install… -> Search for new features to install

New Remote Site…. -> URL: http://subclipse.tigris.org/update_1.4.x

Alte SVN Remote Site entfernen.

Finish … neu starten… strike!

Das Ganze hat allerdings auch einen Hacken: jetzt müssen alle Entwickler, die die IDE bereits ausgecheckt haben, auch das neue Subclipse installieren… Falls dies nicht gewünscht ist und mit der alten SVN Version weiter gearbeitet werden soll, sollte folgende Helfen (nicht ausprobiert!)

Ganzes Directory mit dem File, das mit dem neuen SVN eingecheckt wurde auf OS Ebene löschen (bei mir das SeleniumTest Verzeichnis). Anschließend mit einem alten SVN (bei mir innerhalb von Eclipse) das Verzeichnis komplett neu updaten/ auschecken.