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 ;-)

1 Kommentar:

  1. Ich denke, ich bin gerade ueber das gleiche Problem gestolpert. Die Exception laesst sich vermeiden, indem ich in meiner JSP das Model explizit adressiere.

    Verursacht Exception:

    <s:textfield name="myValue"/>

    Funktioniert:

    <s:textfield name="model.myValue"/>

    Koennte ein Bug sein :-)

    AntwortenLöschen