Spring Json View之异常处理和错误处理

来源:互联网 发布:javascript 画图 编辑:程序博客网 时间:2024/06/07 03:12
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 ...

  }

  }

0 0