一,JSON數(shù)據(jù)返回的理解
? ? ?在Spring MVC中,當(dāng)需要將數(shù)據(jù)以JSON格式返回給客戶端時(shí),可以使用@ResponseBody注解或@RestController注解將Controller方法的返回值直接轉(zhuǎn)化為JSON格式并返回。這使得開(kāi)發(fā)者可以方便地將Java對(duì)象轉(zhuǎn)換為JSON,并通過(guò)HTTP響應(yīng)返回給客戶端。Spring MVC框架會(huì)自動(dòng)地處理這一轉(zhuǎn)換過(guò)程,將對(duì)象序列化為JSON字符串。這種方式適用于RESTful API的實(shí)現(xiàn)
1.2 Jackson
1.2.1 介紹
? ? Jackson是一個(gè)簡(jiǎn)單基于Java應(yīng)用庫(kù),Jackson可以輕松的將Java對(duì)象轉(zhuǎn)換成json對(duì)象和xml文檔,同樣也可以將json、xml轉(zhuǎn)換成Java對(duì)象。Jackson所依賴的jar包較少,簡(jiǎn)單易用并且性能也要相對(duì)高些,并且Jackson社區(qū)相對(duì)比較活躍,更新速度也比較快。
1.2.2?特點(diǎn)
容易使用,提供了高層次外觀,簡(jiǎn)化常用的用例。
無(wú)需創(chuàng)建映射,API提供了默認(rèn)的映射大部分對(duì)象序列化。
性能高,快速,低內(nèi)存占用
創(chuàng)建干凈的json
不依賴其他庫(kù)
代碼開(kāi)源
1.2.3.常用注解
注解 | 說(shuō)明 |
---|---|
@JsonIgnore | 作用在字段或方法上,用來(lái)完全忽略被注解的字段和方法對(duì)應(yīng)的屬性 |
@JsonProperty | 作用在字段或方法上,用來(lái)對(duì)屬性的序列化/反序列化,可以用來(lái)避免遺漏屬性,同時(shí)提供對(duì)屬性名稱重命名 |
@JsonIgnoreProperties | 作用在類上,用來(lái)說(shuō)明有些屬性在序列化/反序列化時(shí)需要忽略掉 |
@JsonUnwrapped | 作用在屬性字段或方法上,用來(lái)將子JSON對(duì)象的屬性添加到封閉的JSON對(duì)象 |
@JsonFormat | 指定序列化日期/時(shí)間值時(shí)的格式 |
二,JSON入門的使用
2.1 導(dǎo)入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>
?2.2 配置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執(zhí)行AJAX時(shí),返回JSON出現(xiàn)下載文件-->
<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>
2.3 @ResponseBody注解使用
@ResponseBody
注解的作用是將Controller的方法返回的對(duì)象通過(guò)適當(dāng)?shù)霓D(zhuǎn)換器轉(zhuǎn)換為指定的格式之后,寫入到response對(duì)象的body區(qū),通常用來(lái)返回JSON
數(shù)據(jù)或者是XML數(shù)據(jù)。
注意:在使用此注解之后不會(huì)再走視圖解析器,而是直接將數(shù)據(jù)寫入到輸入流中,他的效果等同于通過(guò)response對(duì)象輸出指定格式的數(shù)據(jù)。
2.4 實(shí)例演示
Mapper.xml的配置:
<select id="mapListPager" resultType="java.util.Map" parameterType="com.Bingzy.model.Tbook" >
select * from t_mvc_book
<where>
<if test="bname != null">
and bname like concat('%',#{bname},'%')
</if>
<if test="bid != null">
and bid = #{bid}
</if>
</where>
</select>
Mapper類的方法:
List<Map> mapListPager(Tbook tbook);
Biz層:
List<Map> mapListPager(Tbook tbook,PageBean pageBean);
實(shí)現(xiàn)Biz層:?
@Override
public List<Map> mapListPager(Tbook tbook, PageBean pageBean) {
return tbookMapper.mapListPager(tbook);
}
JsonController層:?
/**
* @Name BingBing
* @company zking cy
* @create 2023-09-08-19:51
*/
@Controller
@RequestMapping("/book")
public class JsonController {
@Autowired
private TbookBiz tbookbiz;
/**
* 返回List<T>
* @param req
* @param tbook
* @return
*/
@ResponseBody
@RequestMapping("/list")
public List<Tbook> list(HttpServletRequest req, Tbook tbook){
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
List<Tbook> lst = this.tbookbiz.listPager(tbook, pageBean);
return lst;
}
/**
* 返回T
* @param req
* @param tbook
* @return
*/
@ResponseBody
@RequestMapping("/load")
public Tbook load(HttpServletRequest req, Tbook tbook){
if(tbook.getBid() != null){
List<Tbook> lst = this.tbookbiz.listPager(tbook, null);
return lst.get(0);
}
return null;
}
/**
* 返回List<Map>
* @param req
* @param tbook
* @return
*/
@ResponseBody
@RequestMapping("/mapList")
public List<Map> mapList(HttpServletRequest req, Tbook tbook){
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
List<Map> lst = this.tbookbiz.mapListPager(tbook, pageBean);
return lst;
}
/**
* 返回Map
* @param req
* @param tbook
* @return
*/
@ResponseBody
@RequestMapping("/mapLoad")
public Map mapLoad(HttpServletRequest req, Tbook tbook){
if(tbook.getBid() != null){
List<Map> lst = this.tbookbiz.mapListPager(tbook, null);
return lst.get(0);
}
return null;
}
@ResponseBody
@RequestMapping("/all")
public Map all(HttpServletRequest req, Tbook tbook){
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
List<Tbook> lst = this.tbookbiz.listPager(tbook, pageBean);
Map map = new HashMap();
map.put("lst",lst);
map.put("pageBean",pageBean);
return map;
}
@ResponseBody
@RequestMapping("/jsonStr")
public String jsonStr(HttpServletRequest req, Tbook tbook){
return "clzEdit";
}
}
以下我會(huì)以JSON格式的不同情況來(lái)演示數(shù)據(jù)回顯
返回List<T>:
返回T:
?返回List<Map>:
返回Map:
返回JSON數(shù)組:
返回字符串:
三,異常機(jī)制的處理
3.1 異常機(jī)制處理概念
? ? ? 異常處理是在應(yīng)用程序中捕獲和處理異常的過(guò)程。在Spring MVC中,異常處理機(jī)制允許我們?cè)谡?qǐng)求處理的各個(gè)階段捕獲異常并采取相應(yīng)的操作,比如返回錯(cuò)誤頁(yè)面或JSON格式的錯(cuò)誤信息。通過(guò)自定義異常處理器,我們可以在應(yīng)用程序中集中管理異常,并為每種異常定義不同的處理方式
3.2 為什么要全局異常處理
? ? ? ?我們知道,系統(tǒng)中異常包括:編譯時(shí)異常和運(yùn)行時(shí)異常RuntimeException,前者通過(guò)捕獲異常從而獲取異常信息,后者主要通過(guò)規(guī)范代碼開(kāi)發(fā)、測(cè)試通過(guò)手段減少運(yùn)行時(shí)異常的發(fā)生。在開(kāi)發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類型的異常處理從各處理過(guò)程解耦出來(lái),既保證了相關(guān)處理過(guò)程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)。
3.3?異常處理思路
系統(tǒng)的dao、service、controller出現(xiàn)異常都通過(guò)throws Exception向上拋出,最后由springmvc前端控制器交由異常處理器進(jìn)行異常處理。springmvc提供全局異常處理器(一個(gè)系統(tǒng)只有一個(gè)異常處理器)進(jìn)行統(tǒng)一異常處理
具體來(lái)說(shuō),異常處理的思路包括以下幾個(gè)方面:
確定異常類型:在進(jìn)行異常處理之前,需要先確定可能會(huì)出現(xiàn)哪些異常情況,以及這些異常情況對(duì)應(yīng)的異常類型。
添加異常處理代碼:在程序中添加相應(yīng)的異常處理代碼,用于捕獲可能出現(xiàn)的異常,并進(jìn)行相應(yīng)的處理。
處理異常:根據(jù)不同的異常類型,采取不同的處理方式。例如,對(duì)于運(yùn)行時(shí)異常,可以采取打印錯(cuò)誤信息等方式進(jìn)行處理;對(duì)于受檢異常,則需要在方法聲明中添加throws關(guān)鍵字,并在調(diào)用該方法時(shí)進(jìn)行try-catch處理。
優(yōu)化異常處理:在實(shí)際應(yīng)用中,需要根據(jù)具體情況對(duì)異常處理進(jìn)行優(yōu)化。例如,可以使用多線程機(jī)制來(lái)提高程序的性能;或者使用日志系統(tǒng)來(lái)記錄程序運(yùn)行過(guò)程中出現(xiàn)的異常情況等。
異常處理思路圖:
3.4 SpringMVC異常分類
使用Spring MVC提供的簡(jiǎn)單異常處理器SimpleMappingExceptionResolver;
實(shí)現(xiàn)Spring的異常處理接口HandlerExceptionResolver自定義自己的異常處理器;
使用@ControllerAdvice + @ExceptionHandler
四,案例異常實(shí)戰(zhàn)(三種)
4.1?異常處理方式一
SpringMVC中自帶了一個(gè)異常處理器叫SimpleMappingExceptionResolver,該處理器實(shí)現(xiàn)了HandlerExceptionResolver 接口,全局異常處理器都需要實(shí)現(xiàn)該接口
在spring-mvc.xml配置文件:
<!-- springmvc提供的簡(jiǎn)單異常處理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定義默認(rèn)的異常處理頁(yè)面 -->
<property name="defaultErrorView" value="error"/>
<!-- 定義異常處理頁(yè)面用來(lái)獲取異常信息的變量名,也可不定義,默認(rèn)名為exception -->
<property name="exceptionAttribute" value="ex"/>
<!-- 定義需要特殊處理的異常,這是重要點(diǎn) -->
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">error</prop>
</props>
<!-- 還可以定義其他的自定義異常 -->
</property>
</bean>
JsonController創(chuàng)建一個(gè)錯(cuò)誤方法:
@RequestMapping("/error")
public String error(Tbook tbook) {
tbook = null;
tbook.getBname();
return "error";
}
在WEB-INF創(chuàng)建jsp包下創(chuàng)建一個(gè)error.jsp頁(yè)面來(lái)接受報(bào)錯(cuò)信息
error.jsp:?
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>系統(tǒng)繁忙</title>
</head>
<body>
<b1>發(fā)生異常?。?!</b1>
${ex }
</body>
</html>
運(yùn)行結(jié)果:
注意:因?yàn)樵贘sonController已經(jīng)給實(shí)體為null值了接受的Bname值為空值,所以報(bào)出空指針異常
1.通過(guò)instanceof判斷異常類型
2.通過(guò)設(shè)置mv.setView(new MappingJackson2JsonView())方式返回JSON數(shù)據(jù)
4.2 異常處理方式二
創(chuàng)建一個(gè)Package包,定義GlobalException類并繼承RuntimeException
GlobalException類:
package com.Bingzy.Excetion;
public class GlobalException extends RuntimeException {
public GlobalException() {
}
public GlobalException(String message) {
super(message);
}
public GlobalException(String message, Throwable cause) {
super(message, cause);
}
public GlobalException(Throwable cause) {
super(cause);
}
public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
再創(chuàng)建一個(gè)Package包,定義GlobalExceptionHandler類并繼承HandlerExceptionResolver?
GlobalExceptionHandler類:
@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) {
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
if (e instanceof GlobalException){
GlobalException globalException = (GlobalException) e;
mv.addObject("ex",globalException.getMessage());
mv.addObject("msg","全局異常....");
}else if (e instanceof RuntimeException){
RuntimeException runtimeException = (RuntimeException) e;
mv.addObject("ex",runtimeException.getMessage());
mv.addObject("msg","運(yùn)行時(shí)異常....");
}
return mv;
}
}
在JsonController中再創(chuàng)建一個(gè)error2方法
@RequestMapping("/error2")
public String error2(Tbook tbook) {
if (true)
throw new GlobalException("你不正經(jīng) 怎么能亂發(fā)請(qǐng)求呢?????");
return "error";
}
error.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>系統(tǒng)繁忙</title>
</head>
<body>
<b1>發(fā)生異常!??!</b1>
<br>-----------------------<br>
${ex }
<br>--------------------<br>
${msg }
</body>
</html>
運(yùn)行結(jié)果:
4.3?異常處理方式三
定義一個(gè)GlobalExceptionResolver類
package com.Bingzy.GlobaExcetion;
import com.Bingzy.Excetion.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalExceptionResolver {
// 返回錯(cuò)誤json數(shù)據(jù)
@ResponseBody
@ExceptionHandler
public Map handler(Exception e){
Map map = new HashMap();
if (e instanceof GlobalException){
GlobalException globalException = (GlobalException) e;
map.put("ex",globalException.getMessage());
map.put("msg","全局異常....");
}else if (e instanceof RuntimeException){
RuntimeException runtimeException = (RuntimeException) e;
map.put("ex",runtimeException.getMessage());
map.put("msg","運(yùn)行時(shí)異常....");
}else {
map.put("ex",e.getMessage());
map.put("msg","其它異常....");
}
return map;
}
}
?這種方式是將我們的錯(cuò)誤信息進(jìn)行map保存然后轉(zhuǎn)換為JSON格式輸出在頁(yè)面上
好啦 今天的分享就到這啦? 感覺(jué)還不錯(cuò)的小伙伴還請(qǐng)三連噢!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-726870.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-726870.html
到了這里,關(guān)于SpringMVC之JSON數(shù)據(jù)返回與異常處理機(jī)制---全方面講解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!