2012-04-25 37 views
1

我需要從類似於此this issue的java bean調用ssjs。問題是,我需要執行的代碼來自一個配置文件,並可能看起來像:如何從Java Bean調用ad hoc SSJS

getComponent("xxx").getValue(); 

我已經建立,做一個版本:

String compute = doc.getItemValueString("SSJSStuff"); 
String valueExpr = "#{javascript:" + compute + "}"; 
FacesContext fc = FacesContext.getCurrentInstance(); 
Application app = fc.getApplication(); 
ValueBinding vb = app.createValueBinding(valueExpr); 
String vreslt = vb.getValue(fc).toString(); 

,但我得到"Exception in xxx: com.ibm.xsp.exception.EvaluationExceptionEx: Error while executing JavaScript computed expression"

我覺得我很接近,但我沒有看到山上..任何想法?

回答

2

有幾種可能性是:

  1. 變量計算是空
  2. 計算含有非法字符
  3. 計算是惡意代碼/沒有正確的語法
  4. SSJS代碼中沒有返回對象:

    如果您SSJS代碼不返回的東西,vb.getValue(FC)返回。 A toString()將失敗。爲了防止這種情況,你應該明確地投你回來的對象:

    vreslt = (String) vb.getValue(fc); 
    

希望這有助於

斯文

編輯
重新閱讀你的文章後,我看到了你想在動態SSJS代碼中執行getComponent。這不適用於將值綁定添加到javax.faces.application.Application。對於這一點,你必須使用com.ibm.xsp.page.compiled.ExpressionEvaluatorImpl對象,而不是:

String valueExpr = "#{javascript:" + compute + "}"; 
FacesContext fc = FacesContext.getCurrentInstance(); 
ExpressionEvaluatorImpl evaluator = new ExpressionEvaluatorImpl(fc); 
ValueBinding vb = evaluator.createValueBinding(fc.getViewRoot(), valueExpr, null, null); 
vreslt = (String) vb.getValue(fc); 
+0

爲#4的答案 - 因爲該組件在這一點上是不可用正在返回任何對象在XSP生命週期中。我通過將dataSource中的NotesDocument傳遞給Java Bean方法來解決這個問題,所以我可以反對實際的Notes字段。我將更深入地研究ExpressionEvaluatorImpl,因爲它承諾此項目的其他部分。/Newbs – Newbs 2012-04-26 15:57:00

+0

有沒有辦法像javax.script.ScriptEngine中的put(key,object)一樣將對象注入SSJS評估?我想對Java文檔集合中的所有文檔評估相同的腳本。 – 2013-09-02 15:02:02

+0

@PanuHaaramo:對不起,我不明白你在做什麼... – 2013-09-06 09:41:47