目录
2.1 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
2.2 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
2.3 使用@ControllerAdvice + @ExceptionHandle
1. Json三种数据格式
1.1 添加相关依赖和配置文件
- 在pom.xml文件里面添加以下依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.3</version>
</dependency>
-
在spring-mvc.xml文件里面添加以下配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJackson2HttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
1.2 对象格式
在请求处理方法中添加@ResponseBody注解,将返回结果直接转换成JSON
注:此请求处理方法返回的已经不是视图了
@RequestMapping("/toJsonLoadBook")
@ResponseBody
public Book toJsonLoadBook(Book book){
Book b = iBookService.selectByPrimaryKey(book.getBookId());
return b;
}
1.3 list格式
@RequestMapping("/toJsonListBook")
@ResponseBody
public List<Book> toJsonListBook(){
List<Book> list = iBookService.listBook(null, null);
return list;
}
1.4 混合格式
- 单个
@RequestMapping("/toJsonMap1")
@ResponseBody
public Map<String ,Object> toJsonMap1(Book book) {
Map<String, Object> map = new HashMap<>();
map.put("total", 888);
map.put("success", true);
//获取数据
List<Map<String, Object>> maps = iBookService.jsonMap(book.getBookId());
map.put("data", maps);
return map;
}
- 多个
@RequestMapping("/toJsonMap2")
@ResponseBody
public Map<String ,Object> toJsonMap2(Book book) {
Map<String, Object> map = new HashMap<>();
map.put("total", 888);
map.put("success", true);
//获取数据
List<Map<String, Object>> maps = iBookService.jsonMap1(book);
map.put("data", maps);
return map;
}
2. SpringMVC全局异常处理
- 注!!!需先创建一个error.jsp抛出异常而呈现在前端页面的类
2.1 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
- 在spring-mvc.xml文件里面添加以下配置
<!-- springmvc提供的简单异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面 -->
<property name="defaultErrorView" value="error"/>
<!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->
<property name="exceptionAttribute" value="ex"/>
<!-- 定义需要特殊处理的异常,这是重要点 -->
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">error</prop>
</props>
<!-- 还可以定义其他的自定义异常 -->
</property>
</bean>
- Controller层代码
在controller层验证判断id大与500就会抛出异常在spring-mvc.xml配置文件加上的配置就会处理异常抛出跳转到你创建的error.jsp那个页面
@RequestMapping("/toJsonLoadBook")
@ResponseBody
public Book toJsonLoadBook(Book book){
if(book.getBookId()>=500){
throw new RuntimeException("书本ID大于500,抛出异常");
}
Book b = iBookService.selectByPrimaryKey(book.getBookId());
b.setDate(new Date());
return b;
}
2.2实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
package com.jmh.mybatis.exception;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 全局异常处理
*/
@Component
public class GloabException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, java.lang.Exception e) {
//定义一个视图
ModelAndView mv=new ModelAndView();
//判断ex是否和Run异常有关系
if(e instanceof RuntimeException){
//强转
RuntimeException e1=(RuntimeException)e;
//将获取到的数据保存到作用域里面
mv.addObject("msg", e1.getMessage());
}
//设置跳转页面
mv.setViewName("error");
return mv;
}
}
- Controller层
@RequestMapping("/toJsonLoadBook")
@ResponseBody
public Book toJsonLoadBook(Book book){
if(book.getBookId()>=500){
throw new RuntimeException("书本ID大于500,抛出异常");
}
Book b = iBookService.selectByPrimaryKey(book.getBookId());
b.setDate(new Date());
return b;
}
2.3 使用@ControllerAdvice + @ExceptionHandler
- 定义异常通知
package com.jmh.mybatis.exception;
/**
* 异常通知
*/
public class IdOverException extends RuntimeException{
public IdOverException() {
super();
}
public IdOverException(String message) {
super(message);
}
public IdOverException(String message, Throwable cause) {
super(message, cause);
}
public IdOverException(Throwable cause) {
super(cause);
}
protected IdOverException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
- 异常类
package com.jmh.mybatis.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ControllerAdvice
public class Exception {
@ExceptionHandler
public ModelAndView resolveException(java.lang.Exception e) {
//定义一个视图
ModelAndView mv=new ModelAndView();
//判断ex是否和Run异常有关系
if(e instanceof RuntimeException){
//强转
RuntimeException e1=(RuntimeException)e;
//将获取到的数据保存到作用域里面
mv.addObject("msg", e1.getMessage());
}
//设置跳转页面
mv.setViewName("error");
return mv;
}
}
- Controller层
@RequestMapping("/toJsonLoadBook")
@ResponseBody
public Book toJsonLoadBook(Book book){
if(book.getBookId()>=500){
throw new IdOverException("书本ID大于500,抛出异常");
}
Book b = iBookService.selectByPrimaryKey(book.getBookId());
b.setDate(new Date());
return b;
}