2016-05-24 51 views
1

我有一個帶有struts2表單的jsp,它具有輸入窗口小部件的類型編號,如果我清空這個窗口小部件然後提交給struts中的表單(在我的驗證方法之前)在調試日誌得到這樣的:如何在struts2 action中驗證表單輸入

19:10:30,734 ERROR [com.opensymphony.xwork2.interceptor.ParametersInterceptor.error:34] Developer Notification (set struts.devMode to false to disable this message): 
Unexpected Exception caught setting 'someDto.intCol' on 'class mypackage.MyAction: Error setting expression 'someDto.intCol' with value ['', ] 

我想捕捉到這個異常(以下簡稱「意外的異常」)做一些事情,然後在驗證器(在行動)設置從ActionSupport類與addFieldError錯誤,

感謝您的幫助:)

編輯:

的DTO類:

public class SomeDto() { 

    private Integer intCol; //{with getters&setters} 

的問題是,當用戶清除表中提供的輸入(在jsp),支柱嘗試轉換[「」](或字符串空換句話說)與ParametersInterceptor類的Integer(就像在日誌隊列中一樣)。

所以,dto有getters和setter。

+0

intCol變量的數據類型是什麼? –

+0

爲此目的,你需要另一個params攔截器。你需要發佈MCVE,因爲如果沒有它,問題就變成了話題。 –

+0

你錯過了二傳手 –

回答

1

您可以使用 「ParameterAware」 攔截器:

@Override 
public void setParameters(Map<String, String[]> parameters) { 
    System.out.println("parameters: " + parameters); 

    if (parameters.get("someDto.intCol")[0].length() == 0) { 
     parameters.put("someDto.intCol", new String[]{"0"}); 
    } 
} 

這將趕上從JSP帕拉姆,如果是空將把0代替,

問候。

0

正如@RomanC提到如果你看看周圍ParametersInterceptor 299線,你會發現這個循環:

for (Map.Entry<String, Object> entry : acceptableParameters.entrySet()) { 
      String name = entry.getKey(); 
      Object value = entry.getValue(); 
      try { 
       newStack.setParameter(name, value); 
      } catch (RuntimeException e) { 
       if (devMode) { 
        notifyDeveloperParameterException(action, name, e.getMessage()); 
       } 
      } 
     } 

這裏就是發生異常時,你看到的日誌信息。你可以擴展ParametersInterceptor並做你想做的。例如,您可以在ValueStack中放入一些參數,然後在action中使用它。

但它似乎非常棘手,我也是。你可能會找到另一種解決問題的方法,而不是直接處理這個攔截器代碼。例如,將intCol轉換爲String並使用驗證器。