spring boot validaciones


en la llamada agregar @valid

@PostMapping("/users")
public User addUser(@Valid @RequestBody User user) {
userService.save(user);
return user;
}

y en la clase user:

@NotBlank(message = "Please provide an email")
@Column(name="email")
private String email;

notBlank valida que el campo no sea nulo y que contenga al menos un caracter no blanco

la salida por default si se detectase el error seria asi

{
    "timestamp""2020-03-29T22:13:23.653+0000",
    "status"400,
    "error""Bad Request",
    "errors": [
        {
            "codes": [
                "NotBlank.user.email",
                "NotBlank.email",
                "NotBlank.java.lang.String",
                "NotBlank"
            ],
            "arguments": [
                {
                    "codes": [
                        "user.email",
                        "email"
                    ],
                    "arguments"null,
                    "defaultMessage""email",
                    "code""email"
                }
            ],
            "defaultMessage""Please provide an email",
            "objectName""user",
            "field""email",
            "rejectedValue"null,
            "bindingFailure"false,
            "code""NotBlank"
        }
    ],
    "message""Validation failed for object='user'. Error count: 1",

para hacer mas amigable esta salida
creamos la sigt clase:

package com.isra.Example3.error; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @ControllerAdvice public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler { @Override protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { Map<String, Object> body = new LinkedHashMap<>(); body.put("timestamp", new Date()); body.put("status", status.value()); //Get all errors List<String> errors = ex.getBindingResult() .getFieldErrors() .stream() .map(x -> x.getDefaultMessage()) .collect(Collectors.toList()); body.put("errors", errors); return new ResponseEntity<>(body, headers, status); } }


y la salida sera

{
    "timestamp""2020-03-29T22:29:58.799+0000",
    "status"400,
    "errors": [
        "Please provide an email"
    ]
}


tambien podemos validar los parametros de entrada por ejemplo en un get

@Validated public class UserRestController {
...
public ResponseEntity<User> getUser(@Min(1) @PathVariable int id) {
../


y la salida seria

{
    "timestamp""2020-03-29T23:10:02.890+0000",
    "status"500,
    "error""Internal Server Error",
    "message""getUser.id: tiene que ser mayor o igual que 1",
    "trace""javax..........
}

ss
el codigo de error 500 (internal server) no es correcto vamos a override el metodo constraintViolationException de nuestra clase CustomGlobalExceptionHandler



como reload en tiempo de ejecucion sin reiniciar el server spring boot eclipse

agregar en el pom de  proyecto

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

tener activada la opcion
Project -> build automatically

instalar spring boot en eclipse

https://www.edureka.co/blog/spring-boot-setup-helloworld-microservices-example/

al crear el proyecto en dependencias seleccionar Spring Web
para que se puedan importar las librerias necesarias para reconocer las annotations
de RestController o RequestMapping

error al instalar docker en linux mint

docker se instalo ok
pero si queremos ejecutar por ejemplo
docker ps
nos sale
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.29/containers/json: dial unix /var/run/docker.sock: connect: permission denied

lo que nos obligaria a ejecutar todo anteponiendole "sudo"

desde donde estes 
hay que ejecutar (reiniciar la pc)
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker 

laravel 7 bootstrap


The Bootstrap and Vue scaffolding provided by Laravel is located in the laravel/ui Composer package, which may be installed using Composer:
composer require laravel/ui

Once the laravel/ui package has been installed, you may install the frontend scaffolding using the ui Artisan command:
// Generate basic scaffolding...
php artisan ui bootstrap
After installing the laravel/ui Composer package and generating the frontend scaffolding, Laravel's package.json file will include the bootstrap package to help you get started prototyping your application's frontend using Bootstrap.


Before compiling your CSS, install your project's frontend dependencies using the Node package manager (NPM):
npm install
Once the dependencies have been installed using npm install, you can compile your SASS files to plain CSS using Laravel Mix. The npm run dev command will process the instructions in your webpack.mix.js file. Typically, your compiled CSS will be placed in the public/css directory:
npm run dev

entonces,
ya se puede usar la hoja de stylo desde nuestro archivo de vista base:

en resources/views/base.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Laravel 7 & MySQL CRUD Tutorial</title>
  <link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css" />
</head>
<body>
  <div class="container">
    @yield('main')
  </div>
  <script src="{{ asset('js/app.js') }}" type="text/js"></script>
</body>
</html>
sadsad

entonces  nuestras paginas que extiende de este archivo por ejemplo las de
resources/views/posts

@extends('base') 
@section('main')
<div class="row">
...
<div/>
@endsection

como saber la version de laravel de tu aplicacion

desde la raiz de tu proyecto en la consola ejecuta

php artisan -V

y la salida deberia ser algo parecido

Laravel Framework 7.0.7

diferencias entre composer install y composer update

Por convencion en las aplicaciones que manejan sus dependencias a traves de composer
 no suben a los repositorios los paquetes que no forman parte de la aplicación. Es decir, los que están en la carpeta vendor.
por eso lo primero que se hace luego de clonar la aplicacion es crear la carpeta vendor.


LAs dependencias se configuran en composer.json

 La primera vez que ejecutamos composer install en un proyecto, Composer lee ese fichero, resuelve las dependencias que hay en él e instala los paquetes en el directorio vendor.

y crea un archivo llamado

composer.lock

con la lista de dependencias generadas con sus respectivas versiones

las siguientes veces que se ejecute
composer.install

se leera ese archivo y solo instalara las dependencias que no se encuentren en la carpeta vendor.

normalmente se usara composer install para que el equipo tenga el mismo entorno (dependencias con las mismas versiones)


composer update lee siempre de composer.json
y descarga las versiones actualizadas de las dependencias
y actualiza el composer .lock


se puede actualizar librerias individuales

# Puedes actualizar únicamente uno o varios paquetes separándolos por espacios
composer update doctrine/dbal laravel/framework

# Puedes actualizar todos los paquetes de un proveedor (‘vendor’) usando un asterisco
composer update doctrine/*


para agregar paquetes nuevos:

composer require [paquete]

se instalara el paquete y se actualizara el composer.json

ejemplo: composer require doctrine/dbal:~2.3

si se quiere eliminar un paquete:

composer remove [paquete]



linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable