乐趣区

关于springboot:Spring-Boot快速入门之十二异常处理

【注】本文译自:https://www.tutorialspoint.com/spring_boot/spring_boot_exception_handling.htm


对于企业应用而言,在 API 中解决好异样和谬误是至关重要的。本文将带你学习如果在 Spring Boot 中解决异样。

在学习异样解决前让咱们先来了解上面的注解:

Controller Advice

@ControllerAdvice 注解用于解决全局异样。

Exception Handler

@ExceptionHandler 注解是用于解决指定的异样并向客户端发送一个自定义的响应。

能够应用上面的代码来创立 @ControllerAdvice 类以解决全局异样:

package com.tutorialspoint.demo.exception;

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

@ControllerAdvice

public class ProductExceptionController {

}

定义一个继承 RuntimeException 的类。

package com.tutorialspoint.demo.exception;

public class ProductNotfoundException extends RuntimeException {

private static final long serialVersionUID = 1L;

}

如下所示,能够定义 @ExceptionHandler 办法来解决异样。这个办法该当被用于编写 Controller Advice 类文件。

@ExceptionHandler(value = ProductNotfoundException.class)

public ResponseEntity<Object> exception(ProductNotfoundException exception) {

}

当初,应用以下代码来抛出来自 API 的异样:

@RequestMapping(value = “/products/{id}”, method = RequestMethod.PUT)

public ResponseEntity<Object> updateProduct() {

throw new ProductNotfoundException();

}

残缺的异样解决代码如下所示。在这个例子中,咱们应用 PUT API 来更新产品。当更新产品时,如果找不到产品,返回的响应音讯是“Product not found”。留神 ProductNotFoundException 异样类该当继承 RuntimeException。

package com.tutorialspoint.demo.exception;

public class ProductNotfoundException extends RuntimeException {

private static final long serialVersionUID = 1L;

}

Controller Advice 类解决全局异样,如下所示。咱们能够在这个类文件中定义任何 Exception Handler 办法。

package com.tutorialspoint.demo.exception;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

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

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

@ControllerAdvice

public class ProductExceptionController {

@ExceptionHandler(value = ProductNotfoundException.class)

public ResponseEntity<Object> exception(ProductNotfoundException exception) {

return new ResponseEntity<>(“Product not found”, HttpStatus.NOT_FOUND);

}

}

上面的 Product Service API controller 文件更新产品。如果产品不存在,就抛出 ProductNotFoundException 类。

package com.tutorialspoint.demo.controller;

import java.util.HashMap;

import java.util.Map;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestBody;

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

import org.springframework.web.bind.annotation.RequestMethod;

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

import com.tutorialspoint.demo.exception.ProductNotfoundException;

import com.tutorialspoint.demo.model.Product;

@RestController

public class ProductServiceController {

private static Map<String, Product> productRepo = new HashMap<>();

static {

Product honey = new Product();

honey.setId(“1”);

honey.setName(“Honey”);

productRepo.put(honey.getId(), honey);

Product almond = new Product();

almond.setId(“2”);

almond.setName(“Almond”);

productRepo.put(almond.getId(), almond);

}

@RequestMapping(value = “/products/{id}”, method = RequestMethod.PUT)

public ResponseEntity<Object> updateProduct(@PathVariable(“id”) String id, @RequestBody Product product) {

if(!productRepo.containsKey(id))throw new ProductNotfoundException();

productRepo.remove(id);

product.setId(id);

productRepo.put(id, product);

return new ResponseEntity<>(“Product is updated successfully”, HttpStatus.OK);

}

}

主 Spring Boot 利用类文件如下:

package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

}

产品 POJO 类 如下:

package com.tutorialspoint.demo.model;

public class Product {

private String id;

private String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Maven build – pom.xml 代码如下所示:

<?xml version = “1.0” encoding = “UTF-8”?>

<project xmlns = “http://maven.apache.org/POM/4.0.0”

xmlns:xsi = “http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation = “http://maven.apache.org/POM/4.0.0

http://maven.apache.org/xsd/maven-4.0.0.xsd”>

<modelVersion>4.0.0</modelVersion>

<groupId>com.tutorialspoint</groupId>

<artifactId>demo</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>demo</name>

<description>Demo project for Spring Boot</description>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.5.8.RELEASE</version>

<relativePath/>

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

</project>

Gradle Build – build.gradle 代码如下:

buildscript {

ext {

springBootVersion = ‘1.5.8.RELEASE’

}

repositories {

mavenCentral()

}

dependencies {

classpath(“org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}”)

}

}

apply plugin: ‘java’

apply plugin: ‘eclipse’

apply plugin: ‘org.springframework.boot’

group = ‘com.tutorialspoint’

version = ‘0.0.1-SNAPSHOT’

sourceCompatibility = 1.8

repositories {

mavenCentral()

}

dependencies {

compile(‘org.springframework.boot:spring-boot-starter-web’)

testCompile(‘org.springframework.boot:spring-boot-starter-test’)

}

你能够应用 Maven 或 Gradle 命令构建 JAR 并运行 Spring Boot 利用:

Maven 命令如下:

mvn clean install

“BUILD SUCCESS”之后,你能够在 target 目录下找到 JAR 文件。

Gradle 能够应用如下命令:

gradle clean build

“BUILD SUCCESSFUL”后,你能够在 build/libs 目录下找到 JAR 文件。

你能够应用上面的命令运行 JAR 文件。

java –jar <JARFILE>

在 Tomcat 8080 端口启动利用,如下所示:

当初,在 POSTMAN 利用中单击上面的 URL,你能够看到如下输入:

更新 URL: http://localhost:8080/products/3

退出移动版