2012-09-13 67 views
2

簡單地說,我想評估一下我的動作的屬性並在註釋中使用它的值。 以下是我想要使用它的地方。使用json插件時帶參數的Struts2註釋

我想在運行時定義一個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

問題的一部分是我正在處理實體對象並序列化集合是一​​個問題。用你自己定製的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)); 
    } 
}