स्प्रिंग बूट - अपवाद हैंडलिंग

एपीआई में अपवाद और त्रुटियों को संभालना और क्लाइंट को उचित प्रतिक्रिया भेजना उद्यम अनुप्रयोगों के लिए अच्छा है। इस अध्याय में, हम सीखेंगे कि स्प्रिंग बूट में अपवादों को कैसे संभालना है।

अपवाद से निपटने के लिए आगे बढ़ने से पहले, हमें निम्नलिखित एनोटेशन पर एक समझ हासिल करनी चाहिए।

नियंत्रक सलाह

@ControllerAdvice एक एनोटेशन है, विश्व स्तर पर अपवादों को संभालने के लिए।

अपवाद हैंडलर

@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 विधि को परिभाषित कर सकते हैं। इस विधि का उपयोग नियंत्रक सलाह वर्ग फ़ाइल लिखने के लिए किया जाना चाहिए।

@ExceptionHandler(value = ProductNotfoundException.class)

public ResponseEntity<Object> exception(ProductNotfoundException exception) {
}

अब, एपीआई से अपवाद को फेंकने के लिए नीचे दिए गए कोड का उपयोग करें।

@RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
public ResponseEntity<Object> updateProduct() { 
   throw new ProductNotfoundException();
}

अपवाद को संभालने का पूरा कोड नीचे दिया गया है। इस उदाहरण में, हमने उत्पाद को अपडेट करने के लिए PUT API का उपयोग किया। यहां, उत्पाद को अपडेट करते समय, यदि उत्पाद नहीं मिला है, तो प्रतिक्रिया त्रुटि संदेश "उत्पाद नहीं मिला" के रूप में वापस करें। ध्यान दें किProductNotFoundException अपवाद वर्ग को विस्तार करना चाहिए RuntimeException

package com.tutorialspoint.demo.exception;
public class ProductNotfoundException extends RuntimeException {
   private static final long serialVersionUID = 1L;
}

विश्व स्तर पर अपवाद को संभालने के लिए नियंत्रक सलाह वर्ग नीचे दिया गया है। हम इस क्लास फ़ाइल में किसी भी अपवाद हैंडलर विधियों को परिभाषित कर सकते हैं।

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);
   }
}

उत्पाद को अद्यतन करने के लिए उत्पाद सेवा एपीआई नियंत्रक फ़ाइल नीचे दी गई है। यदि उत्पाद नहीं मिला है, तो यह फेंकता है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);
   }
}

मुख्य स्प्रिंग बूट एप्लिकेशन क्लास फ़ाइल का कोड नीचे दिया गया है -

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 class उत्पाद के लिए नीचे दिया गया है -

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')
}

आप एक निष्पादन योग्य JAR फ़ाइल बना सकते हैं, और मावेन या ग्रैडल कमांड का उपयोग करके स्प्रिंग बूट एप्लिकेशन चला सकते हैं -

मावेन के लिए, आप निम्नलिखित कमांड का उपयोग कर सकते हैं -

mvn clean install

"बिल्ड सफलता" के बाद, आप लक्ष्य निर्देशिका के तहत जार फ़ाइल पा सकते हैं।

ग्रेडल के लिए, आप निम्न कमांड का उपयोग कर सकते हैं -

gradle clean build

“BUILD SUCCESSFUL” के बाद, आप JAR फाइल को बिल्ड / लिबास डायरेक्टरी के तहत पा सकते हैं।

आप JAR फ़ाइल को निम्न कमांड का उपयोग करके चला सकते हैं -

java –jar <JARFILE>

यह नीचे दिखाए गए अनुसार टॉमकैट पोर्ट 8080 पर आवेदन शुरू करेगा -

अब POSTMAN एप्लिकेशन में नीचे दिए गए URL को हिट करें और आप नीचे दिखाए अनुसार आउटपुट देख सकते हैं -

अद्यतन URL: http: // localhost: 8080 / उत्पाद / 3