1. 程式人生 > >Spring Json View之異常處理和錯誤處理

Spring Json View之異常處理和錯誤處理

Spring Json View之錯誤處理和異常處理

  錯誤處理

  錯誤處理是在控制器增加一些公共或欄位級別的錯誤(繫結結果集)到Model後觸發的。

  1.   配置

  2.   HttpStatusError

  3.   ModelFlagError

  4.   自主實現JsonErrorHandler

  1. Spring配置檔案:view.xml

  把錯誤(公共級別的和欄位級別的)配置好後轉換成一個json字串,所有註冊的Json錯誤處理會按它們被新增的順序來觸發。

  下列是JsonErrorHadnders的實現:

  HttpStatusError

  通過response.setStatus(errorCode)設定一個新返回狀態;一些Ajax框架比如prototype.js中觸發成功狀態使用返回狀態編碼是200-299,失敗狀態使用>=300,

  預設編程式碼為311。

  ModelFlagError

  在Model裡增加一個簡單鍵值對。一些Web2.0 表現層框架需要一個標記來判斷伺服器端的操作是否成功或失敗。比如Ext框架需要一個failure=true 或者success=true。

  預設標記是failure=true。

  <beans>

  <bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">

  <property name="jsonErrors">

  <list>

  <ref bean="statusError" />

  <ref bean="modelflagError" />

  </list>

  </property>

  </bean>

  <bean name="statusError"

  class="org.springframework.web.servlet.view.json.error.HttpStatusError"/>

  <bean name="modelflagError"

  class="org.springframework.web.servlet.view.json.error.ModelFlagError"/>

  </beans>

  效果:

  =======

  Response-Status : 311

  {"command":{

  "birthday":"30-01-2008",

  "placeofbirth":"Sydney"

  },

  "failure":"true",

  "hasGlobalErrors":"true",

  "globalerrors": ["errormessage1","errormessage2"],

  "hasFieldErrors":"true",

  "fielderrors":{

  "birthday":"Please enter a valide date!"

  }}

  2. HttpStatusError

  你可以通過在HttpStatusError Bean的errorCode屬性裡自定義一個狀態錯誤編碼增加到響應資訊裡。

  <beans>

  <bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">

  <property name="jsonErrors">

  <list>

  <ref bean="statusError" />

  </list>

  </property>

  </bean>

  <bean name="statusError"

  class="org.springframework.web.servlet.view.json.error.HttpStatusError">

  <property name="errorCode"$amp;>amp;$lt;value>999</value$amp;>amp;$lt;/property>

  </bean>

  </beans>

  效果:

  =======

  Response-Status : 999

  {"command":{

  "birthday":"30-01-2008",

  "placeofbirth":"Sydney"

  },

  "hasGlobalErrors":"true",

  "globalerrors": ["errormessage1","errormessage2"],

  "hasFieldErrors":"true",

  "fielderrors":{

  "birthday":"Please enter a valide date!"

  }}

  3. ModelFlagError

  你可以通過在ModelFlagError Bean以設定鍵和值屬性的方式把它們以鍵值對的形式新增到Model裡。

  <beans>

  <bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">

  <property name="jsonErrors">

  <list>

  <ref bean="statusError" />

  <ref bean="modelflagError" />

  </list>

  </property>

  </bean>

  <bean name="modelflagError"

  class="org.springframework.web.servlet.view.json.error.ModelFlagError">

  <property name="name"$amp;>amp;$lt;value>failure</value$amp;>amp;$lt;/property>

  <property name="value"$amp;>amp;$lt;value>true</value$amp;>amp;$lt;/property>

  </bean>

  </beans>

  效果:

  =======

  Response-Status : 200

  {"command":{

  "birthday":"30-01-2008",

  "placeofbirth":"Sydney"

  },

  "failure":"true",

  "hasGlobalErrors":"true",

  "globalerrors": ["errormessage1","errormessage2"],

  "hasFieldErrors":"true",

  "fielderrors":{

  "birthday":"Please enter a valide date!"

  }}

  4. 自主實現JsonErrorHandler

  最後,您也可以通過實現JsonErrorHandler來建立自己的錯誤處理。

  public class MyErrorHandler implements JsonErrorHandler {

  public void triggerError(Map model, RequestContext rc, BindingResult br,

  HttpServletRequest request, HttpServletResponse response)

  throws Exception{

  // Do something ...

  }

  }

  異常處理

  Spring Json-View 提供HandlerExceptionResolver (JsonExceptionResolver)在Controller操作的期間捕獲並丟擲異常。

  1.   配置

  2.   JsonErrorHandler

  3.   JsonExceptionHandler

  1.ExceptionMessageExceptionHandler(異常訊息異常處理器)

  2.StackTraceExceptionHandler (堆疊異常處理器)

  3.自定義實現JsonExceptionHandler

  1. 配置:Spring ApplicationContext

  你幾乎只需要註冊一個JsonErrorHandlers 或者 JsonExceptionHandler 就可以來操作函式中的響應以便丟擲異常。

  注意:

  把JsonExceptionResolver 註冊在ApplicationContext.xml,

  而不是view.xml !!!,不然會找不到它。

  JsonErrorHandlers

  JsonErrorHandlers 發響應到客戶端因為有些產生了錯誤。詳細資訊參見上面錯誤處理部分。

  HttpStatusError

  用response.setStatus(錯誤編碼)設定一個響應狀態。

  ModelFlagError

  在Model中新增一個簡單鍵值對。

  JsonExceptionHandler

  JsonExceptionHandler負責把Java異常物件轉換成一個Json字串。

  ExceptionMessageExceptionHandler

  新增一個Java異常到Model裡。預設的ModelKey是"exception.message ". ExceptionMessageExceptionHandler 通過"Exception Classname : Exception Message "格式設定錯誤資訊。

  比如 : "java.lang.IllegalArgumentException : Please set Parameter "

  StackTraceExceptionHandler 

  把完整的堆疊異常新增到Model.預設的ModelKey是"exception.stacktrace".當replaceLineBreakes=true時表示可用Html</br>標記代替"\n"。

  預設replaceLineBreakes=false。

  <beans>

  <bean id="exceptionResolver"

  class="org.springframework.web.servlet.view.json.exception.JsonExceptionResolver">

  <property name="exceptionView"$amp;>amp;$lt;value>jsonView</value$amp;>amp;$lt;/property>

  <property name="errorHandler">

  <list>

  <ref bean="statusError" />

  <ref bean="modelFlagError" />

  </list>

  </property>

  <property name="exceptionHandler">

  <list>

  <ref bean="exceptionMessageExceptionHandler" />

  <ref bean="stackTraceExceptionHandler" />

  </list>

  </property>

  </bean>

  <bean name="exceptionMessageExceptionHandler"

  class="org.springframework.web.servlet.view.json.exception.ExceptionMessageExceptionHandler" />

  <bean name="stackTraceExceptionHandler"

  class="org.springframework.web.servlet.view.json.exception.StackTraceExceptionHandler" />

  <bean name="statusError"

  class="org.springframework.web.servlet.view.json.error.HttpStatusError"/>

  <bean name="modelFlagError"

  class="org.springframework.web.servlet.view.json.error.ModelFlagError"/>

  </beans>

  效果:

  =======

  Response-Status : 311

  {

  "failure":"true",

  "exception.message":"java.lang.Exception: You throw an exeption !",

  "exception.stacktrace": "java.lang.Exception: You throw an exeption !

  \n\tat org.thinntroller.[...]

  \n\tat org.springframework.web.servlet.mvc.[...]

  [...]"

  }

  2. ExceptionMessageExceptionHandler

  你也可以自己訂製Model-key方式的異常資訊。預設是exception.message

  <beans>

  <bean id="exceptionResolver"

  class="org.springframework.web.servlet.view.json.exception.JsonExceptionResolver">

  <property name="exceptionView"$amp;>amp;$lt;value>jsonView</value$amp;>amp;$lt;/property>

  <property name="exceptionHandler">

  <list>

  <ref bean="exceptionMessageExceptionHandler" />

  </list>

  </property>

  </bean>

  <bean name="exceptionMessageExceptionHandler"

  class="org.springframework.web.servlet.view.json.exception.ExceptionMessageExceptionHandler">

  <property name="modelKey"$amp;>amp;$lt;value>myKey</value$amp;>amp;$lt;/property>

  </bean>

  </beans>

  效果:

  =======

  Response-Status : 200

  {

  "myKey":"java.lang.Exception: You throw an exeption !"

  }

  3. StackTraceExceptionHandler

  你能訂製Model-Key的堆疊跟蹤異常(預設是exception.stacktrace);你也能用Html檢視模式展現它,replaceLineBreakes=true可用Html</br>標記代替"\n",預設 replaceLineBreakes=false

  <beans>

  <bean id="exceptionResolver"

  class="org.springframework.web.servlet.view.json.exception.JsonExceptionResolver">

  <property name="exceptionView"$amp;>amp;$lt;value>jsonView</value$amp;>amp;$lt;/property>

  <property name="exceptionHandler">

  <list>

  <ref bean="stackTraceExceptionHandler" />

  </list>

  </property>

  </bean>

  <bean name="stackTraceExceptionHandler"

  class="org.springframework.web.servlet.view.json.exception.StackTraceExceptionHandler">

  <property name="replaceLineBreakes"$amp;>amp;$lt;value>true</value$amp;>amp;$lt;/property>

  <property name="modelKey"$amp;>amp;$lt;value>myKey</value$amp;>amp;$lt;/property>

  </bean>

  </beans>

  效果:

  =======

  Response-Status : 200

  {

  "myKey": "java.lang.Exception: You throw an exeption !

  <\br>\tat org.thinntroller.[...]

  <\br>\tat org.springframework.web.servlet.mvc.[...]

  [...]"

  }

  4. Custom implementation of JsonExceptionHandler

  你也通過實現JsonExceptionHandler介面,並可用一些完全不同的方式來重構它。

  public class MyExceptionHandler implements JsonExceptionHandler {

  public void triggerException(Exception exception, Map model,

  HttpServletRequest request, HttpServletResponse response)

  throws Exception{

  // Do something ...

  }

  }