首先引入jar包,用于读取配置资源文件:
<!-- commons组件读取配置文件相关依赖 -->
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.8</version>
</dependency>
自定义异常:
public class DuplicateException extends RuntimeException{
private static final long serialVersionUID = 1L;
public DuplicateException() {
}
public DuplicateException(String message){
super(message);
}
}
利用控制器通知注解@ControllerAdvice将自定义异常集中在同一个地方处理:
/**
* 带有@ControllerAdvice的类中,所有带有@ExceptionHandler的方法会应用到
* 整个应用程序所有控制器中带有@RequestMapping注解的方法上
* 注解@ControllerAdvice本身已经使用了@Component注解
* @author dai
*
*/
@ControllerAdvice
public class AppWideExceptionHandler {
@ExceptionHandler(DuplicateException.class)
public String duplicateHandler(HttpServletRequest request,DuplicateException ex){
request.setAttribute("error", ex.getMessage());
return "error/duplicate";
}
}
控制器方法抛出自定义异常:
@RequestMapping(value="/register",method=POST)
public String processRegistration(Spitter spitter) throws IOException{
if("test".equals(spitter.getUsername())){
throw new DuplicateException(getProperty("username.duplicate"));
}
return "redirect:/spitter/"+spitter.getUsername();
}
此处用到的自定义错误提示,是通过读取property配置文件来获得。
getProperty()方法是自己封装好的,如下:
public class PropertiesUtil {
private static PropertiesConfiguration configuration = null;
public static String getProperty(String key){
try {
configuration = new PropertiesConfiguration("/spittr/props/errors.properties");
} catch (ConfigurationException e) {
e.printStackTrace();
}
return configuration.getString(key);
}
}
该工具类利用了Commons组件包,/spittr/props/errors.properties为资源文件的项目类加载路径,注意:
commons-configuration组件抛出的ConfigurationException异常引用了commons-lang-2.6.jar包,所以commons-lang jar包的版本不能太高,这里用的是2.6版本,测试可以通过。
errors.properties定义如下:
username.duplicate=用户名重复!
前台JSP相关代码:
This is an error page! <br />
error:<c:out value="${error}"></c:out>
项目运行后,在前台表单输入用户名"test",提交后跳转到错误提示页面,并显示用户名重复!
参考资料:《Spring实战(第4版)》