{"id":301,"date":"2021-08-09T10:18:00","date_gmt":"2021-08-09T10:18:00","guid":{"rendered":"https:\/\/www.escueladefrikis.com\/?p=301"},"modified":"2021-08-09T10:18:00","modified_gmt":"2021-08-09T10:18:00","slug":"exception-handler-en-laravel-8-como-se-hace-en-spring-boot","status":"publish","type":"post","link":"https:\/\/escueladefrikis.com\/index.php\/2021\/08\/09\/exception-handler-en-laravel-8-como-se-hace-en-spring-boot\/","title":{"rendered":"Exception Handler en Laravel 8 &#8211; C\u00f3mo se hace en Spring Boot"},"content":{"rendered":"\n<p>En el art\u00edculo anterior introduje una manera de implementar <a href=\"https:\/\/www.escueladefrikis.com\/2021\/06\/21\/dto-en-laravel-8\/\">DTOs<\/a> para las entradas y salidas (requests y responses) de una API pero qued\u00f3 coja porque dentro del DTO pretend\u00eda validar el modelo.<\/p>\n<p>Antes de ver la soluci\u00f3n en Laravel, me gustar\u00eda mostrar la soluci\u00f3n a la que quiero llegar pero en otro lenguaje y con otro framework: Spring Boot en Java.<\/p>\n<p><!--more--><\/p>\n<p>Spring Boot permite una gesti\u00f3n bastante simple de las excepciones mediante dos anotaciones:<\/p>\n<ul>\n<li><strong>@ControllerAdvice<\/strong>: permite definir una clase que gestione las excepciones de manera global.<\/li>\n<li><strong>@ExceptionHandler<\/strong>: permite definir un m\u00e9todo que gestione un tipo de excepci\u00f3n concreto.<\/li>\n<\/ul>\n<p>Uno de los miles tutoriales que pod\u00e9is encontrar est\u00e1 en <a href=\"https:\/\/www.tutorialspoint.com\/spring_boot\/spring_boot_exception_handling.htm\">tutorialspoint<\/a> y muestro un ejemplo en el que defino dos clases:<\/p>\n<ul>\n<li><strong>NotFoundException<\/strong>: una excepci\u00f3n particular<\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-plain\"><code>package com.escueladefrikis.example.exception;\n\npublic class NotFoundException extends RuntimeException {\n  private static final long serialVersionUID = 1L;\n}<\/code><\/pre><\/div>\n\n\n\n<ul>\n<li>Una clase que gestione las excepciones y en el que incluyo un m\u00e9todo que gestione la excepci\u00f3n que acabo de definir:<\/li>\n<\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-plain\"><code>package com.escueladefrikis.example.exception;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\n\n@ControllerAdvice\npublic class ExceptionController {\n  @ExceptionHandler(value = NotFoundException.class)\n  public ResponseEntity&lt;Object&gt; handleNotFoundException(NotFoundException exception) {\n    return new ResponseEntity&lt;&gt;(&quot;Item not found&quot;, HttpStatus.NOT_FOUND);\n  }\n}<\/code><\/pre><\/div>\n\n\n\n<p>Ahora, esta excepci\u00f3n la podemos utilizar en cualquier punto en el c\u00f3digo, dentro del controlador, dentro del servicio, etc. Cuando lancemos la excepci\u00f3n (si no la capturamos) la respuesta a la llamada al endpoint ser\u00e1 la respuesta del m\u00e9todo \u00abhandleNotFoundException\u00bb, que es 404 con el texto \u00abNot found\u00bb. Por ejemplo:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-plain\"><code>package com.escueladefrikis.example.controller;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.escueladefrikis.example.exception.NotFoundException;\nimport com.escueladefrikis.example.controller.model.Book;\n\n@RestController\npublic class BooksController {\n  @RequestMapping(value = &quot;\/books\/{id}&quot;, method = RequestMethod.GET)\n  public ResponseEntity&lt;Object&gt; getBook(@PathVariable(&quot;id&quot;) String id) { \n    return findBook(id);\n  }\n\n  private ResponseEntity&lt;Object&gt; findBook(String id) {\n    Optional&lt;Book&gt; book = respository.findById(id);\n    if (book.isEmpty()) {\n      throw new NotFoundException();\n    }\n    \/\/ The rest of the code\n  }\n}<\/code><\/pre><\/div>\n\n\n\n<p>Es un ejemplo muy simplificado, pero creo que muestra cu\u00e1l es la soluci\u00f3n que quiero conseguir en Laravel 8. En el siguiente art\u00edculo mostrar\u00e9 c\u00f3mo.<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,5],"tags":[19,22,30],"class_list":["post-301","post","type-post","status-publish","format-standard","hentry","category-laravel-8","category-programacion","tag-excepciones","tag-laravel","tag-spring-boot"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts\/301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/comments?post=301"}],"version-history":[{"count":0,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts\/301\/revisions"}],"wp:attachment":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/media?parent=301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/categories?post=301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/tags?post=301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}