使用json插件时带参数的Struts2注释

时间:2012-09-13 05:44:29

标签: struts2 annotations struts2-json-plugin

我只想评估我的动作的属性并在注释中使用它的值。 以下是我想要使用它的地方。

我想在运行时定义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的动作,它显示了在注释中解析参数。我正在使用命名的变量模式匹配器从命名空间中提取值...但无论我做什么,我似乎都无法设置此参数。

1 个答案:

答案 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));
    }
}