我对 Struts 2.2.3.1 操作进行了一个相对简单的 Ajax 调用,该操作返回一个简单的 Java POJO。一旦我们向那个 POJO 添加一个简单的 Enum 并执行操作,我们就会在服务器的日志中收到一堆这样的消息:
[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 Exception。
用于 Ajax 调用的 Out Struts XML 类似于:
<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 是一个 POJO,其中包含原始字段和我们的 ThingEnum。
我们的枚举看起来像这样:
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 之前手动将 Enum 转换为字符串,这是我们当前的解决方案 - 我们基本上在 Result 对象中有一个 thingDescription 字符串,而不是 ThingEnum 字段。