I created a custom result class for serializing json data in xml. I want to customize this result class as a result for some specific actions using conditional plugins. But it gives errors during container launch. My code and error are given below.
My custom result class:
package actions;
import example.*;
import java.io.PrintWriter;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.util.ValueStack;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
public class JSONResult implements Result {
public static final String DEFAULT_PARAM = "classAlias";
String classAlias;
public String getClassAlias() {
return classAlias;
}
public void setClassAlias(String classAlias) {
this.classAlias = classAlias;
}
public void execute(ActionInvocation invocation) throws Exception {
System.out.println("executing JSONResult execute()");
ServletActionContext.getResponse().setContentType("text/plain");
PrintWriter responseStream = ServletActionContext.getResponse().getWriter();
ValueStack valueStack = invocation.getStack();
Object jsonModel = valueStack.findValue("jsonModel");
XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
if (classAlias == null) {
classAlias = "object";
}
xstream.registerConverter(new XStreamHashConverter());
xstream.alias(classAlias, jsonModel.getClass());
System.out.println("xstream.toXML(jsonModel) == "+xstream.toXML(jsonModel));
responseStream.println(xstream.toXML(jsonModel));
}
}
my Actions class with annotations follows:
package actions;
import com.opensymphony.xwork2.ActionSupport;
import java.util.HashMap;
import java.util.Map;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.interceptor.ParameterAware;
@ParentPackage("actions")
@Namespace("/actions")
public class ZipDataSupplier extends ActionSupport implements ParameterAware
{
private Map parameters;
private Object jsonModel;
public Map getParameters()
{
return this.parameters;
}
public void setParameters(Map parameters)
{
this.parameters=parameters;
}
public Object getJsonModel()
{
return this.jsonModel;
}
public void setJsonModel(Object jsonModel)
{
this.jsonModel = jsonModel;
}
@Action(value="/getZipData",results={@Result(name="success",location="ajaxCall", **type="actions.JSONResult")**})
public String getZipData()
{
System.out.println("inside getZipData ... ...");
Map map = getParameters();
System.out.println("parameter map = "+map);
String htmlIds = ((String[])map.get("htmlIds"))[0];
System.out.println("htmlIds = "+htmlIds);
String jsonIds = ((String[])map.get("jsonIds"))[0];
System.out.println("jsonIds = "+jsonIds);
ZipData zipData = new ZipData();
zipData.getCity().put("Dulles", "Dulles");
zipData.getCity().put("New York", "New York");
setJsonModel(zipData);
return SUCCESS;
}
}
class ZipData
{
private String zipCode = "20101";
private String stateCode = "VA";
private String stateName = "Virginia";
private HashMap<String,String> city=new HashMap<String, String>();
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getStateCode() {
return stateCode;
}
public void setStateCode(String stateCode) {
this.stateCode = stateCode;
}
public String getStateName() {
return stateName;
}
public void setStateName(String stateName) {
this.stateName = stateName;
}
public HashMap<String, String> getCity() {
return city;
}
public void setCity(HashMap<String, String> city) {
this.city = city;
}
}
The Struts.XML file follows:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true"/>
<constant name="struts.configuration.xml.reload" value="true"/>
</struts>
source
share