Spring MVC全局异常处理和单元测试_动力节点Java学院整理

Spring MVC是一种流行的Java Web框架,其拥有全局异常处理机制,可以在程序抛出异常后,统一处理并返回指定的错误信息。本篇攻略主要包含两部分内容,分别是Spring MVC全局异常处理和单元测试。

一、Spring MVC全局异常处理

1.1 在Spring配置文件中配置异常处理拦截器

在Spring的配置文件中,可以配置一个全局的异常处理拦截器,用来捕获应用程序中抛出的异常。该拦截器需要实现HandlerExceptionResolver接口,并在配置文件中进行配置。

<bean class="com.example.ExceptionHandler"/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </list>
    </property>
</bean>

1.2 定义异常处理类

定义一个异常处理类,实现HandlerExceptionResolver接口,并实现resolveException方法,该方法中可以对不同异常进行分类处理。

@Component
public class ExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        if (ex instanceof BusinessException) {
            modelAndView.addObject("errorMsg", ex.getMessage());
            modelAndView.setViewName("error/business_error");
        } else if (ex instanceof AuthorityException) {
            modelAndView.addObject("errorMsg", ex.getMessage());
            modelAndView.setViewName("error/authority_error");
        } else {
            modelAndView.addObject("errorMsg", "系统内部错误,请稍后再试!");
            modelAndView.setViewName("error/system_error");
        }
        return modelAndView;
    }
}

1.3 自定义异常类

自定义异常类可以用来分类处理不同类型的异常。例如,BusinessException用来处理业务异常,AuthorityException用来处理权限异常。

public class BusinessException extends RuntimeException {

    public BusinessException(String message) {
        super(message);
    }
}

public class AuthorityException extends RuntimeException {

    public AuthorityException(String message) {
        super(message);
    }
}

1.4 抛出异常

在应用程序中,可以通过抛出自定义异常的方式让全局异常处理器捕获并处理异常。

public void delete(Long id) {
    if (id == null || id <= 0L) {
        throw new BusinessException("ID不合法!");
    }
    if (repository.delete(id) == 0) {
        throw new BusinessException("删除失败,数据可能已不存在!");
    }
}

1.5 配置视图解析器

在Spring MVC的配置文件中,配置视图解析器,用于解析视图名称,并将其转换为真正的视图对象。在本例中,使用了JSP视图解析器,并将异常处理的视图页面放在了WEB-INF目录下的error子目录中。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

至此,Spring MVC全局异常处理配置完成。

二、单元测试

单元测试是软件开发过程中必不可少的一环,能够有效地保证软件的质量和稳定性。在本例中,使用了JUnit和Mockito两个Java测试框架。

2.1 配置pom.xml

在pom.xml文件中添加JUnit和Mockito的依赖。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.22.0</version>
    <scope>test</scope>
</dependency>

2.2 编写单元测试类

编写单元测试类,使用Mockito对依赖对象进行模拟,然后测试要求的功能。

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @InjectMocks
    private UserServiceImpl service;

    @Mock
    private UserRepository repository;

    @Test
    public void testDelete() {
        when(repository.delete(1L)).thenReturn(1);
        service.delete(1L);
        verify(repository, times(1)).delete(1L);
    }
}

2.3 运行测试

通过运行JUnit测试,可以验证代码的正确性,并及时发现问题并修复。

至此,单元测试部分完成。

示例一:

public void testDelete() {
    when(repository.delete(1L)).thenReturn(1);
    service.delete(1L);
    verify(repository, times(1)).delete(1L);
}

该单元测试用来测试业务服务的delete方法是否能够正确地调用持久层的delete方法,并返回正确的结果。

示例二:

public void testResolveException() {
    ModelAndView modelAndView = exceptionHandler.resolveException(request, response, null, new BusinessException("业务异常"));
    Assert.assertNotNull(modelAndView);
    Assert.assertEquals("业务异常", modelAndView.getModel().get("errorMsg"));
    Assert.assertEquals("error/business_error", modelAndView.getViewName());
}

该单元测试用来测试全局异常处理器能否正确地处理业务异常,并且返回正确的错误页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring MVC全局异常处理和单元测试_动力节点Java学院整理 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 如何用Dos命令运行Java版HelloWorld你知道吗

    当你要在DOS命令提示符下运行Java程序时,需要打开一个命令行界面,进入Java程序所在的目录,然后使用特定的命令执行该程序。 以下是在DOS命令提示符下运行Java程序的完整攻略: 步骤一:安装Java 在运行Java程序之前,你必须先安装Java开发工具包(JDK)。你可以从Oracle官网上下载并安装适用于您的操作系统的Java JDK版本。安装完成…

    Java 2023年5月26日
    00
  • spring中IOC控制反转依赖注入和new对象的区别说明

    下面是关于“spring中IOC控制反转依赖注入和new对象的区别说明”的完整攻略。 控制反转(IoC) 控制反转,即IoC(Inversion of Control),是一种将程序的控制权从调用者转移至被调用者的设计模式。在传统的编程模式中,客户端程序通常需要直接创建和管理对象,并通过其接口调用其方法来完成所需的业务逻辑。而在IoC模式中,对象的创建和管理…

    Java 2023年5月26日
    00
  • 简析Java中的util.concurrent.Future接口

    简析Java中的util.concurrent.Future接口 java.util.concurrent.Future是Java中实现异步操作和并发编程的一个核心接口,它的主要作用是提供一个机制,允许异步任务返回一个结果和处理异常,这个结果将在未来的某个时间点通过Future对象来获取。即,当我们发起一个异步请求后,系统会立即返回一个Future对象,通过…

    Java 2023年5月25日
    00
  • 解决JAVA非对称加密不同系统加密结果不一致的问题

    为了解决JAVA非对称加密在不同系统中加密结果不一致的问题,我们需要在代码中指定加密算法的provider,这样可以使加密在不同系统中的表现一致。 下面是解决该问题的步骤: 确认加密算法的provider 我们需要明确加密算法的provider信息,以RSA算法为例,该算法的provider为BC(BouncyCastle)。 将provider添加进代码 …

    Java 2023年5月19日
    00
  • 纯JSP实现的简单登录示例

    下面是“纯JSP实现的简单登录示例”的完整攻略: 1. 准备工作 首先需要创建一个简单的web应用程序。在该程序的根目录下创建一个名为“login.jsp”的文件,用于用户登录。 2. 页面设计 下面来设计程序的页面。在login.jsp文件中,创建一个表单以便用户输入用户名和密码: <form name="loginform" m…

    Java 2023年6月15日
    00
  • 解析Java和IDEA中的文件打包问题

    下面是关于解析Java和IDEA中的文件打包问题的完整攻略。 一、问题背景 在进行Java项目开发中,打包是非常重要的一个环节。Java的打包方式主要包括两种:jar和war。常见的打包工具有Maven、Gradle等,开发工具本身也自带打包机制,如IntelliJ IDEA中的Maven插件和Gradle插件。但是在实际操作中,我们经常会遇到一些打包问题,…

    Java 2023年5月19日
    00
  • MyBatis如何实现多表查询(多对一、一对多)

    MyBatis 是一种优秀的持久层框架,它提供了一种灵活方便的方式来处理多表操作。多表查询中最常见的场景是多对一和一对多关系。接下来我们详细讲解 MyBatis 如何实现这两种关系的多表查询。 多对一查询 多对一查询通常是一个表中的多条数据对应另一个表中的一条数据。在 MyBatis 中实现多对一查询的步骤如下: 步骤一:建立实体类 我们需要建立两张表的实体…

    Java 2023年5月20日
    00
  • 浅谈@RequestMapping注解的注意点

    浅谈@RequestMapping注解的注意点 @RequestMapping注解是Spring MVC中最常用的注解之一,它用于将HTTP请求映射到控制器方法。在本文中,我们将详细讲解@RequestMapping注解的注意点,并提供两个示例来说明这个过程。 注意点 在使用@RequestMapping注解时,我们需要注意以下几点: value属性 @Re…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部