diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java index dfa0d6cff..2da32109e 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONResult.java @@ -20,12 +20,16 @@ */ package org.apache.struts2.json; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.Result; -import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.WildcardUtil; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -33,13 +37,12 @@ import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsStatics; import org.apache.struts2.json.smd.SMDGenerator; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.Result; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.WildcardUtil; /** *
This result serializes an action @@ -84,6 +87,7 @@ public class JSONResult implements Result { private boolean ignoreInterfaces = true; private boolean enumAsBean = JSONWriter.ENUM_AS_BEAN_DEFAULT; private boolean noCache = false; + private boolean cacheBeanInfo = true; private boolean excludeNullProperties = false; private String defaultDateFormat = null; private int statusCode; @@ -92,12 +96,18 @@ public class JSONResult implements Result { private String contentType; private String wrapPrefix; private String wrapSuffix; - + private boolean debugMode = false; + @Inject(StrutsConstants.STRUTS_I18N_ENCODING) public void setDefaultEncoding(String val) { this.defaultEncoding = val; } - + + @Inject(StrutsConstants.STRUTS_DEVMODE) + public void setDebugMode(String val) { + this.debugMode = BooleanUtils.toBoolean(val); + } + /** * Gets a list of regular expressions of properties to exclude from the JSON * output. @@ -171,7 +181,10 @@ public class JSONResult implements Result { ActionContext actionContext = invocation.getInvocationContext(); HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE); - + + // only permit caching bean information when struts devMode = false + cacheBeanInfo = !debugMode; + try { Object rootObject; rootObject = readRootObject(invocation); @@ -202,7 +215,7 @@ public class JSONResult implements Result { protected String createJSONString(HttpServletRequest request, Object rootObject) throws JSONException { String json = JSONUtil.serialize(rootObject, excludeProperties, includeProperties, ignoreHierarchy, - enumAsBean, excludeNullProperties, defaultDateFormat); + enumAsBean, excludeNullProperties, defaultDateFormat, cacheBeanInfo); json = addCallbackIfApplicable(request, json); return json; } diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java index 0ee024e3d..bde729837 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONUtil.java @@ -20,20 +20,34 @@ */ package org.apache.struts2.json; -import com.opensymphony.xwork2.util.TextParseUtil; -import com.opensymphony.xwork2.util.WildcardUtil; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.zip.GZIPOutputStream; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.struts2.json.annotations.SMDMethod; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.lang.reflect.Method; -import java.util.*; -import java.util.regex.Pattern; -import java.util.zip.GZIPOutputStream; +import com.opensymphony.xwork2.util.TextParseUtil; +import com.opensymphony.xwork2.util.WildcardUtil; /** * Wrapper for JSONWriter with some utility methods. @@ -43,7 +57,8 @@ public class JSONUtil { public final static String RFC3339_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; private static final Logger LOG = LogManager.getLogger(JSONUtil.class); - + private static final boolean CACHE_BEAN_INFO_DEFAULT = true; + /** * Serializes an object into JSON. * @@ -53,7 +68,22 @@ public class JSONUtil { * @throws JSONException */ public static String serialize(Object object) throws JSONException { + return serialize(object, CACHE_BEAN_INFO_DEFAULT); + } + + /** + * Serializes an object into JSON. + * + * @param object + * to be serialized + * @param cacheBeanInfo + * Specifies whether to cache bean info in the JSONWriter + * @return JSON string + * @throws JSONException + */ + public static String serialize(Object object, boolean cacheBeanInfo) throws JSONException { JSONWriter writer = new JSONWriter(); + writer.setCacheBeanInfo(cacheBeanInfo); return writer.write(object); } @@ -74,8 +104,33 @@ public class JSONUtil { public static String serialize(Object object, Collection