SpringMVC 异常处理.

一、异常处理

Spring提供了多种方式将异常转换为响应:

  • 特定的Spring异常将会自动映射为指定的HTTP状态码

    在默认情况下,Spring会将自身的一些异常自动转换为合适的状态码,从而反馈给客户端。实际上,如果没有出现任何映射的异常,响应都会带有500状态码。映射表如下:

  • 自定义异常上可以添加@ResponseStatus注解,从而将其映射为某一个HTTP状态码

    尽管这些内置映射是很有用的,但是当我们的业务系统出现RuntimeException时,如果Spring找不到对应的内置映射,就默认是500的状态码,如果我们不想要500的状态码呢?怎么将我们自定义的Exception映射成想要的状态码呢?

1 /**
2  * value 要匹配的异常状态码
3  * reson 提示的异常原因
4  */
5 @ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "Own Exception")
6 public class OwnException extends RuntimeException {
7 }
  • 在方法上可以添加@ExceptionHandler注解,使其用来处理异常

    有很多时候,我们是不想把丑陋的报错页面直接展示给客户来看的,常见的做法是:搭建一个友好的页面,比如 error.jsp ,当发生异常的时候,返回这个页面给客户端。但是五花八门的处理器方法,如果每个地方都做这样的处理,我们的程序就会略显臃肿......Spring 为我们 提供了一种控制器通知(@ControllerAdvice),即:当所有控制器中带有@RequestMapping注解的方法上 出现异常的时候,就委托给这个类的@ExceptionHandler方法处理。

@ControllerAdvice
public class ExceptionHandle {

    /**
     * 当出现异常的时候,就返回error页面,当然可以多写几个ExceptionHandler 方法,细化你的异常处理
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public String handleException(){
        return "error";
    }
}

二、跨重定向请求传递数据 

   在控制器方法返回的String 视图名称中,如果以"redirect:"开头,那么这个String不是用来查找视图的,而是用来指导浏览器进行重定向的路径。有些时候,我们希望浏览器进行重定向后,有些数据是可以保留下来的,这听起来不可思议,但SpringMVC为我们提供了两种方案:

  • 使用URL 模板以路径变量或查询参数的形式传递数据

这种方式将参数放在路径变量中传递,但是有一个缺点就是不能传递复杂的对象...

    @RequestMapping(value = "/home",method = RequestMethod.GET)
    public String getHome(Model model){
        model.addAttribute("userName","userName");
        model.addAttribute("id",123);
        return "redirect:/home/{userName}";
    }

像这样,如果最后的路径会被解析为 /home/userName?id=123

  • 通过flash属性发送数据

如果要传递一些对象要怎么做呢?有一种方式就是在重定向前存在session中,在重定向后再从session中取出来,再清理session。实际上,这种方式是可行的,也是值得推荐的。而且以下介绍的这种(flash attribute)就是基于这个原理的。

    /**
     * 重定向前
     * @param model RedirectAttributes ,保证对象在重定向的过程中存活下来
     * @return
     */
    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public String getList(RedirectAttributes model){
        model.addAttribute("show","show");
        List<String> list = new ArrayList<String>();
        list.add("str");
        model.addFlashAttribute("list",list); // flashAttribute
        return "redirect:{show}";
    }

    /**
     * 重定向后
     * @param model
     * @return
     */
    @RequestMapping(value = "/show",method = RequestMethod.GET)
    public String showList(Model model){
        System.out.println(model.containsAttribute("list")); //true
        return "home";
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

锁机制-java面试

何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和mo...

40160
来自专栏Spring相关

第1章—Spring之旅—容纳你的Bean

1、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

12110
来自专栏爱撒谎的男孩

Spring MVC处理异常

注意:使用SimpleMappingExceptionResolver处理异常时,不可以使用@ExceptionHandler!

36250
来自专栏xingoo, 一个梦想做发明家的程序员

JSP中文乱码问题

之前总是碰到JSP页面乱码的问题,每次都是现在网上搜,然后胡乱改,改完也不明白原因。 这次正好作下总结,中文乱码就是因为编码不符,可能出现乱码有四个地方: ...

43390
来自专栏haifeiWu与他朋友们的专栏

阿里 RPC 框架 DUBBO 初体验

最近研究了一下阿里开源的分布式RPC框架dubbo,楼主写了一个 demo,体验了一下dubbo的功能。

41820
来自专栏禹都一只猫博客

Flask RESTful API 简单的设计一个 GET 请求接口

2.5K50
来自专栏情情说

深入浅出MyBatis:MyBatis的所有配置

上一篇介绍了JDBC的相关概念、MyBatis的特性与Hibernate的区别、MyBatis的基本组件与生命周期,基本可以使用MyBatis了。

38180
来自专栏公众号_薛勤的博客

史上最全面的Spring Boot配置文件详解

Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍。Spring Boot配置文件对Spring Boot来说就是入门和...

2.2K20
来自专栏JMCui

Netty 系列四(ChannelHandler 和 ChannelPipeline).

    先来整体的介绍一下这篇博文要介绍的几个概念(Channel、ChannelHandler、ChannelPipeline、ChannelHandlerC...

13120
来自专栏Java架构师历程

Spring工作原理

      内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、...

23320

扫码关注云+社区

领取腾讯云代金券