r310 - in trunk/nuiton-struts2: . src/main/java/org/nuiton/web/struts2/converters
Author: bleny Date: 2014-02-28 10:54:52 +0100 (Fri, 28 Feb 2014) New Revision: 310 Url: http://nuiton.org/projects/nuiton-web/repository/revisions/310 Log: fixes #3104 introduce JsonConverter and add json-plugin as provided Added: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/JsonConverter.java Modified: trunk/nuiton-struts2/pom.xml Modified: trunk/nuiton-struts2/pom.xml =================================================================== --- trunk/nuiton-struts2/pom.xml 2014-02-04 18:11:04 UTC (rev 309) +++ trunk/nuiton-struts2/pom.xml 2014-02-28 09:54:52 UTC (rev 310) @@ -21,6 +21,11 @@ </dependency> <dependency> + <groupId>org.apache.struts</groupId> + <artifactId>struts2-json-plugin</artifactId> + </dependency> + + <dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> </dependency> Added: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/JsonConverter.java =================================================================== --- trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/JsonConverter.java (rev 0) +++ trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/JsonConverter.java 2014-02-28 09:54:52 UTC (rev 310) @@ -0,0 +1,99 @@ +package org.nuiton.web.struts2.converters; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.struts2.json.JSONException; +import org.apache.struts2.json.JSONPopulator; +import org.apache.struts2.json.JSONUtil; +import org.apache.struts2.util.StrutsTypeConverter; + +import java.util.Arrays; +import java.util.Map; + +/** + * This converter will convert any field by serializing it to its JSON String representation. + * + * You must have struts2-json-plugin provided in you classpath. + * + * If you want the serialized JSON to be printed properly in a JSP, don't forget to escape it: + * + * <pre> + * <s:property value="my.path.to.myProperty" escapeHtml="false" /> + * </pre> + */ +public class JsonConverter extends StrutsTypeConverter { + + private static final Log log = LogFactory.getLog(JsonConverter.class); + + @Override + public Object convertFromString(Map context, String[] values, Class toClass) { + + if (log.isTraceEnabled()) { + log.trace("will convertFromString " + Arrays.toString(values)); + } + + Object object; + if (values.length == 0) { + object = null; + } else if (values.length == 1) { + String json = values[0]; + if (log.isTraceEnabled()) { + log.trace("will deserialize " + json); + } + try { + Map deserialize = (Map) JSONUtil.deserialize(json); + JSONPopulator jsonPopulator = new JSONPopulator(); + object = toClass.newInstance(); + jsonPopulator.populateObject(object, deserialize); + } catch (Throwable e) { + if (log.isErrorEnabled()) { + log.error("unable to parse json =\n" + json, e); + } + throw new RuntimeException("unable to parse json = " + json, e); + } + } else { + throw new UnsupportedOperationException("unable to parse multiple values " + Arrays.toString(values)); + } + + if (log.isTraceEnabled()) { + log.trace("convert from string " + Arrays.toString(values) + " will return " + object); + } + + return object; + } + + @Override + public String convertToString(Map context, Object object) { + + if (log.isTraceEnabled()) { + log.trace("will serialize " + object); + } + + String json; + + if (object == null) { + json = "null"; + } else { + try { + json = JSONUtil.serialize(object); + } catch (JSONException e) { + if (log.isErrorEnabled()) { + log.error("unable to serialize object " + object, e); + } + throw new RuntimeException("unable to serialize object " + object, e); + } catch (Throwable t) { + if (log.isErrorEnabled()) { + log.error("error while serializing object " + object, t); + } + throw new RuntimeException("error while serializing object " + object, t); + } + } + + if (log.isTraceEnabled()) { + log.trace("serialize " + object + " will return " + json); + } + + return json; + + } +} \ No newline at end of file
participants (1)
-
bleny@users.nuiton.org