每日一博 | SpringBoot 入门 — 局部与全局的异常处理

综合技术 2017-07-29 阅读原文

SpringBoot入门——局部与全局的异常处理

1、构建测试代码

(1)、新建MAVEN项目

打开IDE—新建Maven项目—构建一个简单Maven项目

(2)、编写pom.xls引入包

编写pom配置引入jar包

注:引入完毕后可能项目会报红叉,更新maven即可

  4.0.0
  com.springboot
  springboot
  0.0.1-SNAPSHOT
  
		org.springframework.boot
		spring-boot-starter-parent
		1.4.1.RELEASE
	

	
		UTF-8
		1.8
	

	
		
		
			org.springframework.boot
			spring-boot-starter-web
		
		
		
			org.springframework.boot
			spring-boot-devtools
			true
			true
		

	
	
		
			
				org.springframework.boot
				spring-boot-maven-plugin 
				
				
					true
				
			
		
	

(3)、新建一个controller类

包名com.springboot.controller

类名TestController

package com.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//@RestController=@Controller+@ResponseBody
@RestController
@RequestMapping("/test")
public class TestController {
	
	@RequestMapping("/hello1")
	public String hello(){
		return "hello1";
	}
	
}

(4)、新建一个Application类

包名com.springboot

类名TestController

package com.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
		System.out.println("_____OK______");
	}
	
}

然后运行程序

(5)、测试

输入地址http://localhost:8080/test/hello1

如果显示: hello1 ,则测试成功

测试代码编写完成

———————————————————————————————————————

2、局部异常处理

对TestController类进行操作

(1)、创造异常点

如果设置一个变量=整数/0,则会发生ArithmeticException异常

在TestController中加入除0异常点

@RequestMapping("/hello1")
	public String hello(){
		// 自己编写的除0异常
		int a=1/0;

		return "hello1";
	}

(2)、编写异常处理方法

在TestController中加入异常处理方法

//局部异常处理
	@ExceptionHandler(Exception.class)
	public String exHandler(Exception e){
		// 判断发生异常的类型是除0异常则做出响应
		if(e instanceof ArithmeticException){
			return "发生了除0异常";
		}
		// 未知的异常做出响应
		return "发生了未知异常";
	}

(3)、测试

输入地址http://localhost:8080/test/hello1

如果显示: 发生了除0异常 ,则测试成功

———————————————————————————————————————

3、全局异常处理

(1)、创建一个新的Cpntroller类

包名package com.springboot.controller;

类名TestGlobalController

package com.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestGlobalController {
	
	@RequestMapping("/hello2")
	public String hello2(){
		// 自己编写的异常发生点
		int a=1/0;
		
		return "hello2";
	}
	
}

--------------------------------------------------------------------------------------

(2)、编写全局异常类

包名com.springboot.controller.exception

类名GlobalDefaultExceptionHandler

⒈全局异常处理返回字符串

package com.springboot.controller.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalDefaultExceptionHandler {
	
	// 全局异常处理返回字符串
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public String exception(Exception e){
		// 判断发生异常的类型是除0异常则做出响应
		if(e instanceof ArithmeticException){
			return "全局:发生了除0异常";
		}
		// 未知的异常做出响应
		return "全局:发生了未知异常";
	}
}

⒉全局异常处理返回JSON

// 全局异常处理返回JSON
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public Map exception(Exception e){
		Map map=new HashMap();

		// 判断发生异常的类型是除0异常则做出响应
		if(e instanceof ArithmeticException){
			map.put("codeNumber", "1");
			map.put("message", e.getMessage());
			return map;
		}
		// 未知的异常做出响应
		map.put("codeNumber", "0");
		map.put("message", e.getMessage());
		return map;
	}

⒊全局异常处理返回JSP

@ExceptionHandler(Exception.class)
	public String exception(Exception e){

		// 判断发生异常的类型是除0异常则做出响应
		if(e instanceof ArithmeticException){
			// 跳转到test.jsp页面
			return "test";
		}
		// 未知的异常做出响应
		// 跳转到test.jsp页面
		return "test";
	}

注:需要配置一下才能支持jsp

①需要在pom添加JSP的支持

		
			org.apache.tomcat.embed
			tomcat-embed-jasper
			provided
		
		
		
			javax.servlet
			jstl
		

②需要配置application.properties

添加application.properties文件,然后往其中写入

# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp

③需要添加jsp文件

添加JSP,放置在src/main/webapp/WEB-INF目录下

--------------------------------------------------------------------------------------

(3)、全局异常类应用范围设置

⒈@ControllerAdvice简介

在spring 3.2中,新增了@ControllerAdvice 注解可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。

这里我们全局异常只应用到@ExceptionHandler

⒉设置@ControllerAdvice应用范围

设置了@ControllerAdvice应用范围,即就设置了异常类的应用范围

@ControllerAdvice的范围有:

①basePackages: 应用在xx包

②basePackageClasses: 应用在xx类

③assignableTypes: 应用在加了@Controller的类

④annotations: 应用在带有xx注解的类或者方法

————————————————————

≥简单用法例子:

————————————————————

@ControllerAdvice(basePackages={"com.springboot.controller"})

只捕捉com.springboot.controller包中的异常

@ControllerAdvice(basePackageClasses={TestController.class})

只捕捉TestController.class中的异常

@ControllerAdvice(assignableTypes={TestController.class})

只捕捉TestController.class中的异常

@ControllerAdvice(annotations=TestException.class)

只捕捉带有@TestException注解的类

上面四个注解一个应用包,然后的两个用在类,而最后一个只应用于带有XX注解的类

--------------------------------------------------------------------------------------

3、讲讲应用在注解怎么写

1、创建一个注解类

package com.springboot.annotation;

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

// 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射
@Retention(RUNTIME)
// 目标类型可以应用在方法
@Target(ElementType.TYPE)
// 对doc文档支持
@Documented
public @interface TestException {
	
}

---------------------------------------------------------------------------------

注:关于注解类的简说请看:

https://my.oschina.net/u/3523885/blog/1489959

---------------------------------------------------------------------------------

2、将注解加到TestController类

加入@TestException注解

// 加入TestException注解
@TestException
@RestController
@RequestMapping("/test")
public class TestController {
	
	@RequestMapping("/hello1")
	public String hello(){
		// 自己编写的除0异常
		int a=1/0;
		
		return "hello1";
	}

}

3、TestController类不加注解

@RestController
@RequestMapping("/test")
public class TestGlobalController {
	
	@RequestMapping("/hello2")
	public String hello(){
		// 自己编写的除0异常
		int a=1/0;
		
		return "hello2";
	}
	
}

4、设置异常类只捕捉带有@TestException注解的类的异常

// 设置范围应用于带有@TestException的注解的类上
@ControllerAdvice(annotations={TestException.class})
public class GlobalDefaultExceptionHandler {

	@ExceptionHandler(Exception.class)
	@ResponseBody
	public String exceptionReturnString(Exception e){
		// 判断发生异常的类型是除0异常则做出响应
		if(e instanceof ArithmeticException){
			return "全局:发生了除0异常";
		}
		// 未知的异常做出响应
		return "全局:发生了未知异常";
	}
}

5、测试

输入地址 http://localhost:8080/test/hello1

输入地址: http://localhost:8080/test/hello2

开源中国

责编内容by:开源中国阅读原文】。感谢您的支持!

您可能感兴趣的

Versioning RESTful Services This guide will help you understand why versioning is needed and how you can ver...
微信小程序使用code换openid的方法(JAVA、SpringBoot)... 微信小程序序的代码中提示,使用code换取openid,但官方文档中没有给出进一步的说明。 换取openid的要点:由于安全的原因,必须由自己小程序的...
不使用SpringBoot如何将原生Feign集成到Spring中来简化http调用... 在微服务架构中,如果使用得是SpringCloud,那么只需要集成SpringFeign就可以了,SpringFeign可以很友好的帮我们进行服务请求,对...
Spring Boot系列十九 Spring boot集成 swagger Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RES...
从头开始搭建自己的springboot后台框架(一)... Hello大家好,本章我们搭建项目基础框架结构和整合mybatis;项目所需环境jdk1.8,maven,mysql数据库;开发工具IDEA。有问题可以联系我m...