Está en la página 1de 5

Full Stack Java Developer

Laboratorio N° 3

Laboratorio N° 3
PRÁCTICA N° 1

VALIDATION PARA LIBRO DTO

1. Descargar e importar el proyecto “mitiendaapi_s3_base.rar”.


2. Agregar la siguiente dependencia Maven.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

3. Implementar la validación del modelo para LibroDTO.


4. Validar el modelo de forma automática al crear y actualizar un Libro en
AdminLibroController.
5. Probar la implementación.
6. Reemplazar la interpolación de mensajes mediante un archivo
messages.properties (al mismo nivel de application.properties).

NotBlank.libroDTO.titulo=El título es obligatorio.


Size.libroDTO.titulo=El título debe tener {2} caracteres como
mínimo y {1} caracteres como máximo.
NotNull.libroDTO.slug=El slug es obligatorio.
Pattern.libroDTO.slug=El slug debe tener un formato válido:
{2}.
NotBlank.libroDTO.descripcion=La descripción es obligatoria.
NotBlank.libroDTO.rutaPortada=La portada es obligatoria.
NotBlank.libroDTO.rutaArchivo=El archivo es obligatorio.
NotNull.libroDTO.precio=El precio es obligatorio.
PositiveOrZero.libroDTO.precio=El precio debe ser mayor o
igual a 0.

7. Crear la clase RestExceptionHandler que permita gestionar las


excepciones a nivel global y dar un mejor formato al mensaje de
respuesta de la validación.

ErrorDetail errorDetail = new ErrorDetail();

// llenar los detalles del error


errorDetail.setTimeStamp(new Date().getTime());
errorDetail.setStatus(HttpStatus.BAD_REQUEST.value());

1
Full Stack Java Developer
Laboratorio N° 3

errorDetail.setTitle("Error de validación");
errorDetail.setDetail("El formulario tiene algunos errores de
validación");

// crear y agregar los errores de validación


List<FieldError> fieldErrors =
manve.getBindingResult().getFieldErrors();
for (FieldError fe : fieldErrors) {
List<ValidationError> validationErrorList =
errorDetail.getErrors().get(fe.getField());

if (validationErrorList == null) {
validationErrorList = new ArrayList<>();
errorDetail.getErrors().put(fe.getField(),
validationErrorList);
}

ValidationError validationError = new ValidationError();


validationError.setCode(fe.getCode());
validationError.setMessage(messageSource.getMessage(fe,
Locale.getDefault()));
validationErrorList.add(validationError);
}
return errorDetail;

PRACTICA N° 2

EXCEPTION HANDLING

1. Gestionar EntityNotFoundException para retornar el status 404.


2. Crear 2 excepciones personalizadas: StorageService (que devuelva el
status 500) y MediaFileNotFoundException (que devuelva el status 404).

PRACTICA N° 3

SUBIDA DE ARCHIVOS

1. Agregar las siguientes propiedades a application.properties


spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=100MB

2. Crear la clase FileSystemStorageService.

public class FileSystemStorageService {

// TODO: reemplazar por un valor desde application.properties


private final static String STORAGE_LOCATION =

2
Full Stack Java Developer
Laboratorio N° 3

"mediafile";

/**
* Crea el la ubicación de la carpeta para almacenar los
* archivos subidos por el cliente.
*/
public void init() {
try {

Files.createDirectories(Paths.get(STORAGE_LOCATION));
} catch (IOException ex) {
throw new StorageException("No se pudo crear el
almacén de archivos: " + STORAGE_LOCATION);
}
}

/**
* Guarda un archivo en el almacén de archivos
* a partir de un MultipartFile enviado en una solicitud
http.
*/
public String store(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
String filename = UUID.randomUUID() + "." +
StringUtils.getFilenameExtension(originalFilename);

if (file.isEmpty()) {
throw new StorageException("No se puede almacenar
un archivo vacío " + originalFilename);
}

try {
InputStream inputStream = file.getInputStream();
Files.copy(inputStream,
Paths.get(STORAGE_LOCATION).resolve(filename),
StandardCopyOption.REPLACE_EXISTING);
} catch (IOException ex) {
throw new StorageException("Falló al almacenar el
archivo " + originalFilename);
}
return filename;
}

/**
* Carga un archivo como un Resource que puede
* ser retornado en una solicitud http, a partir
* del nombre/ubicación del archivo.
*/
public Resource loadAsResource(String filename) {
try {
Path path =
Paths.get(STORAGE_LOCATION).resolve(filename);
Resource resource = new

3
Full Stack Java Developer
Laboratorio N° 3

UrlResource(path.toUri());

if (resource.exists() || resource.isReadable()) {
return resource;
} else {
throw new MediaFileNotFoundException("El
archivo no ha sido encontrado: " + filename);
}
} catch (MalformedURLException ex) {
throw new MediaFileNotFoundException("El archivo
no ha sido encontrado: " + filename);
}
}

/**
* Elimina un archivo a partir de su
* nombre/ubicación.
*/
public void delete(String filename) {
Path path =
Paths.get(STORAGE_LOCATION).resolve(filename);
try {
FileSystemUtils.deleteRecursively(path);
} catch (IOException ex) {
// lo dejamos pasar
}
}

3. Crear un controlador llamado MediaController que permita subir y


obtener un archivo.

PRACTICA N° 4

CONTROLADOR PÚBLICO

1. Implementar un controlador llamado HomeController que permita:


- Consultar los últimos 6 libros en base a su fecha de creación
- Consultar libros de forma paginada de 10 en 10 ordenados por su
título
- Consultar un libro por su slug
- Consultar una venta por su id

4
Full Stack Java Developer
Laboratorio N° 3

RETO DE LA SESIÓN

USUARIOS

1. Implementar la validación del modelo para UsuarioDTO. Usar las


restricciones más convenientes según el mejor criterio.
2. Validar el modelo de forma automática al crear y actualizar un Usuario
en AdminUsuarioController.
3. Probar la implementación.
4. Implementar la interpolación de mensajes usando el archivo
messages.properties.
5. Implementar un controlador público para que cualquier persona pueda
registrarse como Lector. Retornar un código 400 con un mensaje simple
cuando el email ya se encuentre registrado en la base de datos.

También podría gustarte