SpringMVC之JSON数据返回及异常处理机制

2023-09-13 17:06:16

目录

一.JSON数据的返回

二.异常处理机制

  2.1 异常处理方式一

2.2 异常处理方式二

2.3 异常处理方式三


一.JSON数据的返回

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用程序和服务之间的数据传输。通过使用JSON,数据可以以一种结构化的方式进行组织和存储,并可以方便地在不同的编程语言和平台之间进行解析和使用。

        1.1 要想使用JSON,首先老规矩先导入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> 

            1.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执行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.3.@ResponseBody注解

        我们使用json技术转换时,要先来了解这个注解:@ResponseBody注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

        1.4 基础入门

           接下来,分别写几个方法,来返回不同的返回值分别是返回一个对象,一个数组,返回对象数组,返回JSON字符串.

        在这些方法上面都用到了@ResponseBody注解,如果这整个类里面的方法都是JSON格式的话就可以不需要在每一个方法上面写注解,而是可以在类上面打一个注解就好,

package com.yinzi.web;

/**
 * @author yinzi
 * @create 2023-09-13 14:06
 */

import com.yinzi.Biz.StrutsBiz;
import com.yinzi.model.Struts;
import com.yinzi.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/*@ResponseBody
@Controller  这两个可以用下面这个代替*/
@RestController
@RequestMapping("/struts/json")
public class JsonController {
    @Autowired
    private StrutsBiz StrutsBiz;

    /**
     * 返回List<T>
     */
  /*  @ResponseBody*/
    @RequestMapping("/list")
    public List<Struts> list(HttpServletRequest req, Struts struts){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Struts> lst = this.StrutsBiz.selectList(struts,pageBean);
        return lst;
    }

    /**
     * 返回T
     * @param req
     * @return
     */
  /*  @ResponseBody*/
    @RequestMapping("/load")
    public Struts load(HttpServletRequest req, Struts struts){
        if(struts.getCid() != null){
            List<Struts> lst = this.StrutsBiz.selectList(struts, null);
            return lst.get(0);
        }
        return null;
    }


    /**
     * 返回List<Map>
     * @param req
     * @return
     */
   /* @ResponseBody*/
    @RequestMapping("/mapList")
    public List<Map> mapList(HttpServletRequest req, Struts clazz){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Map> lst = this.StrutsBiz.mapList(clazz, pageBean);
        return lst;
    }

    /**
     * 返回Map
     * @param req
     * @return
     */
   /* @ResponseBody*/
    @RequestMapping("/mapLoad")
    public Map mapLoad(HttpServletRequest req, Struts struts){
        if(struts.getCid() != null){
            List<Map> lst = this.StrutsBiz.mapList(struts, null);
            return lst.get(0);
        }
        return null;
    }


   /* @ResponseBody*/
    @RequestMapping("/all")
    public Map all(HttpServletRequest req, Struts struts){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Struts> lst = this.StrutsBiz.selectList(struts, pageBean);
        Map map = new HashMap();
        map.put("lst",lst);
        map.put("pageBean",pageBean);
        return map;
    }

   /* @ResponseBody*/
    @RequestMapping("/jsonStr")
    public String jsonStr(HttpServletRequest req, Struts struts){
        return "clzEdit";//返回字符串
    }


}

        1.5 结果测试

        大家可以看到输入框中的路径的变化,调用了不同的方法

        1.6 @JsonIgnore注解使用

        如果我们要隐藏属性不被看到的话就可以把这个注解放在属性的上面

可以和上方动图比较,有了这个注解,页面上就不会显示  pic  这个属性了 

二.异常处理机制

        全局异常处理指的是在应用程序的运行过程中,捕获和处理未被明确捕获的异常。它的目的是在发生异常时,能够提供一个统一的处理方式,以保证应用程序的稳定性和可靠性。

        系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

        2.1 异常处理方式一

        改变spring-mvc配置文件

<!-- 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> 

         error.jsp界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
错误❌信息页面
${ex}
</body>
</html>

接着创建一个错误,以演示 

结果:

 

2.2 异常处理方式二

1.通过instanceof判断异常类型
2.通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据

建立一个全局异常的类

package com.yinzi.Component;

import com.yinzi.Exception.GlobalException;
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;

/**
 * @author yinzi
 * @create 2023-09-13 16:28
 */
@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","运行时异常....");
        }else{
            mv.addObject("ex",e.getMessage());
            mv.addObject("msg","其它异常....");
        }
        return mv;
    }
}

        在方法中调用

        结果:

2.3 异常处理方式三

建立异常类

package com.yinzi.Component;

import com.yinzi.Exception.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 {

//    跳转错误页面
//    @ExceptionHandler
//    public ModelAndView handler(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","运行时异常....");
//        }
//        return mv;
//    }

// 返回错误json数据
    @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","运行时异常....");
        }else {
            map.put("ex",e.getMessage());
            map.put("msg","其它异常....");
        }
        return map;
    }
}

结果:

返回的是json数据,而不是页面,如果打开上面的就是返回页面

        今天的分享就到这啦!!

更多推荐

MySQL 约束与复杂查询

当涉及到数据库管理系统(DBMS)的高级主题时,包括数据库的约束、表的设计以及各种类型的查询,特别是聚合查询、联合查询和合并查询,是非常重要的。这些主题可以帮助我们更好地理解数据库的内部工作机制以及如何有效地操作数据。在这篇博客中,我们将深入探讨这些主题~~目录数据库的约束表的设计1.一对一关系(One-to-OneR

了解消息中间件的基础知识

为什么要使用消息中间件?解耦:消息中间件可以使不同的应用程序通过解耦的方式进行通信,减少系统间的依赖关系提供异步通信:消息中间件可以实现异步消息传递,提高系统的响应性能。流量削峰:消息中间件可以起到流量削峰的作用,将短时间内的爆发式流量存储在消息队列中,使系统能够平稳地处理请求解决分布式系统数据传输的需求:如分布式场景

C++57个入门知识点_番外4_静态链接与动态链接中LIB和DLL的区别与使用

在Qt5.9C++开发指南_创建和使用静态链接库和Qt5.9C++开发指南_创建和使用共享库中我们介绍了Qt中创建使用静态链接和动态链接库的方法,本篇是对具体的库文件和使用方法做一个通用的介绍,相互之间互为参考。文章目录1.两种LIB文件介绍2.关于lib和dll的区别3.库文件的链接使用方法3.1两种链接方式3.2静

JavaWeb基础学习(5)

JavaWeb基础学习一、Filter1.1Filter介绍1.2Filter快速入门1.3、Filter执行流程1.4、Filter使用细节1.5、Filter-案例-登陆验证二、Listener2.1Listener介绍2.2、ServletContextListener使用三、AJAX3.1AJAX介绍与概念3.

Java编程实践:使用面向对象编程(OOP)概念构建简单的国际象棋游戏

介绍国际象棋是一个两人玩的策略游戏。使用Java和面向对象编程(OOP)概念来模拟这个游戏可以帮助我们更好地理解OOP的核心原理。本教程将带领您一步步地使用Java构建一个简单的国际象棋游戏。OOP概念概述面向对象编程(OOP)是一种计算机编程范式,其中程序被组织成对象。主要的OOP概念包括:类(Class):定义对象

LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测

论文地址:https://arxiv.org/abs/2303.03595论文代码:https://github.com/sankin97/LoGoNet论文背景激光雷达传感器点云通常是稀疏的,无法提供足够的上下文来区分远处的区域,从而造成性能次优。激光雷达-摄像机融合方法在三维目标检测中表现出了良好的性能。目前先进的

Flask狼书笔记 | 08_个人博客(上)

文章目录8个人博客8.1大型项目结构8.2编写程序骨架8.3编写博客前台8个人博客个人博客是一个典型的CMS(内容管理系统),通常包含前台和后台两部分。这一张将涉及更高级的项目组织方式,以及一些新的Python包:Flask-Login,Unidecode。8.1大型项目结构本章将学习使用蓝本,和工厂函数,来进一步组织

设计模式:策略模式

目录组件代码示例源码中应用优缺点总结策略模式(StrategyPattern)是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法或行为。策略模式通过将算法封装成独立的策略类,使得它们可以互相替换,而不影响客户端的使用。组件在策略模式中,有三个核心组件:策略接口(StrategyInterface):定义了

ARTS打卡第三周

概述infoq的arts打卡学习,贯彻左耳朵耗子的学习理念,活到老学到老,每天都精进一点,上个星期没有写打卡文档,只能用工作太忙为借口为自己开脱了一、Algorithm一道算法题最近工作使用算法场景较少,基本上是基于数据统计对系统进行优化,因此结合工作的算法暂时没有,最近在学习go,就用go来写一些经典算法吧,再配上单

机器学习实战:Python基于LR线性回归进行预测(十)

文章目录1前言1.1LR的介绍1.2LR的应用2.weather数据集实战演示2.1导入函数2.2导入数据2.3数据整体可视化2.4训练模型2.5预测模型2.6评估模型3.讨论1前言注意这里的LR指的是LinearRegression,线性回归。而非逻辑回归LogisticRegression,虽然二者简称都是LR,但

《DevOps实践指南》- 读书笔记(五)

DevOps实践指南Part4第二步:反馈的技术实践14.建立能发现并解决问题的遥测系统14.1建设集中式监控架构14.2建立生产环境的应用程序日志遥测14.3使用遥测指导问题的解决14.4将建立生产遥测融入日常工作14.5建立自助访问的遥测和信息辐射器14.6发现和填补遥测的盲区14.6.1应用程序和业务度量指标14

热文推荐