単純なJavaPOJOを返すStruts2.2.3.1アクションへの比較的単純なAjax呼び出しがあります。そのPOJOに単純な列挙型を追加してアクションを実行すると、サーバーのログに次のような一連のメッセージが表示されます。
[10/19/12 14:55:07:124 EDT] 00000047 BeanAdapter I com.opensymphony.xwork2.util.logging.commons.CommonsLogger info Class com.ibm.ws.ejbcontainer.jitdeploy.JIT_StubPluginImpl has no readable properties, trying to adapt JIT_StubClassPlugin with StringAdapter...
[10/19/12 14:55:07:124 EDT] 00000047 BeanAdapter I com.opensymphony.xwork2.util.logging.commons.CommonsLogger info Class com.ibm.ws.ejbcontainer.jitdeploy.JIT_StubPluginImpl has no readable properties, trying to adapt JIT_StubClassPlugin with StringAdapter...
[10/19/12 14:55:07:139 EDT] 00000047 BeanAdapter I com.opensymphony.xwork2.util.logging.commons.CommonsLogger info Class com.ibm.ws.ejbcontainer.jitdeploy.JIT_StubPluginImpl has no readable properties, trying to adapt JIT_StubClassPlugin with StringAdapter...
[10/19/12 14:55:07:139 EDT] 00000047 BeanAdapter I com.opensymphony.xwork2.util.logging.commons.CommonsLogger info Class com.ibm.ws.ejbcontainer.jitdeploy.JIT_StubPluginImpl has no readable properties, trying to adapt JIT_StubClassPlugin with StringAdapter...
そして最後にOutOfMemory例外が発生します。
Ajax呼び出しのOutStrutsXMLは次のようになります。
<action name="ajaxRetrieveThing" class="x.y.z.action.Thing" method="ajaxRetrieveThing">
<result type="xslt">
<param name="exposedValue">actionResponse</param>
</result>
</action>
ActionResponseクラスの関連部分は次のとおりです。
public class ActionResponse {
// a bunch of primitive types and associated getters and setters skipped
private List<Object> results = new ArrayList<Object>();
public List<?> getResults() {
return results;
}
public void addResult(Object o) {
results.add(o);
}
public void setResultList(List results) {
this.results = results;
}
}
私たちの行動では、結果のリストにThingを入れます。Thingは、プリミティブフィールドとThingEnumを含むPOJOです。
列挙型は次のようになります。
public enum ThingEnum {
VALUE_1( "1" ), VALUE_2( "2" ); // etc
String description;
private ThingEnum( String description ) {
this.description = description;
}
public String getDescription() {
return description;
}
}
アクションは機能し、ThingEnumを追加するまでJavaScriptにデータを取得できます。これは、StrutsがThingEnumをXMLに変換しようとしたときに問題が発生したためだと思います。他のタイプのオブジェクト(たとえば、Hibernateエンティティ)でもこれと同様の問題が発生し、結果オブジェクトに必要な文字列やその他のプリミティブを格納するだけで問題を回避できました。
この問題を回避する正しい方法は何ですか?現在のソリューションであるJSに戻す前に、手動で列挙型を文字列に変換する必要はありません。ThingEnumフィールドを使用する代わりに、基本的にResultオブジェクトにthingDescription文字列を使用します。