2

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

我想在运行时定义一个 excludeProperties 参数。

考虑以下当前适用于该操作的注释:

    @Result(name = "success", type = "json", params = {"root", "model", "excludeProperties", "myCollection"})

那里的动作模型有一个我不想序列化的 myCollection 集合。

但是我想创建一个排除字符串(现在可以使用一个字符串)。

如果我创建一个用于排除的 getter setter,我希望以下注释能够工作(它不起作用):

@Result(name = "success", type = "json", params = {"root", "model", "excludeProperties", "${exclusion}"})

有任何想法吗?

我创建了类似于此答案的操作,它显示了在注释中解析参数。我正在使用命名变量模式匹配器从命名空间中提取值......但无论我做什么,我似乎都无法设置这个参数。

4

1 回答 1

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));
    }
}
于 2013-04-27T05:54:31.217 回答