我只想评估我的动作的属性并在注释中使用它的值。 以下是我想要使用它的地方。
我想在运行时定义excludeProperties参数。
考虑以下注释,该注释目前适用于该操作:
@Result(name = "success", type = "json", params = {"root", "model", "excludeProperties", "myCollection"})
动作模型有一个myCollection集合,我不想序列化。
但是我想创建一个排除字符串(字符串现在可以用)。
如果我创建一个用于排除的getter setter,我希望以下注释可以工作(但不是):
@Result(name = "success", type = "json", params = {"root", "model", "excludeProperties", "${exclusion}"})
有什么想法吗?
我创建了类似于此answer的动作,它显示了在注释中解析参数。我正在使用命名的变量模式匹配器从命名空间中提取值...但无论我做什么,我似乎都无法设置此参数。
答案 0 :(得分:1)
部分问题是我正在使用实体对象,序列化集合是一个问题。使用您自己的自定义JSON结果类型,您可以随心所欲地执行操作。自从为jsonModel创建了getter setter之后,我就构建了我需要的东西。我不需要担心延迟初始化错误,因为你需要使用flexjson显式包含集合,所以如果你只是想要原语(我做过),那么flexjson是完美的。
使用flexjson这个非常简单的结果类型可以满足我的需求:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.util.ValueStack;
import flexjson.JSONSerializer;
import java.io.PrintWriter;
import org.apache.struts2.ServletActionContext;
public class Kjson implements Result {
@Override
public void execute(ActionInvocation invocation) throws Exception {
ServletActionContext.getResponse().setContentType("text/plain");
PrintWriter responseStream = ServletActionContext.getResponse().getWriter();
ValueStack valueStack = invocation.getStack();
Object jsonModel = valueStack.findValue("jsonModel");
//create json and put it into response stream
responseStream.println(new JSONSerializer().exclude("class").serialize(jsonModel));
}
}