Estoy creando una API Rest usando Spring Boot y estoy usando Hibernate Validation para validar entradas de solicitud.
Pero también necesito otros tipos de validación, por ejemplo, cuando los datos de actualización deben verificarse, si la identificación de la empresa no existe, quiero lanzar una excepción personalizada.
¿Debería esta validación ubicarse en la capa de servicio o en la capa de controlador?
Capa de servicio:
public Company update(Company entity) {
if (entity.getId() == null || repository.findOne(entity.getId()) == null) {
throw new ResourceNotFoundException("can not update un existence data with id : "
+ entity.getId());
}
return repository.saveAndFlush(entity);
}
Capa de controlador:
public HttpEntity<CompanyResource> update(@Valid @RequestBody Company companyRequest) {
Company company = companyService.getById(companyRequest.getId());
Precondition.checkDataFound(company,
"Can't not find data with id : " + companyRequest.getId());
// TODO : extract ignore properties to constant
BeanUtils.copyProperties(companyRequest, company, "createdBy", "createdDate",
"updatedBy", "updatedDate", "version", "markForDelete");
Company updatedCompany = companyService.update(company);
CompanyResource companyResource = companyAssembler.toResource(updatedCompany);
return new ResponseEntity<CompanyResource>(companyResource, HttpStatus.OK);
}
fuente
Las validaciones de Hibernate son verificaciones sobre la integridad de los datos. Para evitar RuntimeExceptions de bbdd. Son prácticamente las mismas validaciones que debes controlar con Restrains . Debido a que solo la capa empresarial debe alimentar la capa de persistencia, usted puede (o no, depende de usted) confiar en la exactitud de los datos que provienen de su capa empresarial
No pongo validaciones en DAO. Espero datos válidos de las capas superiores. En caso de error, delego al bbdd la responsabilidad de conocer su contenido.
Luego vienen las validaciones en la capa empresarial. Todas las validaciones comerciales se centraron en mantener la coherencia de los datos, no su integridad .
Finalmente hago validaciones previas en la capa de control. Los relacionados solo con dicha capa.
Pronto verá qué validaciones están destinadas a implementarse en la capa empresarial. El más común: control de identificación. Este se puede implementar fácilmente en ambas capas. Si espera que muchos controladores o clientes consuman su capa empresarial, en lugar de repetir la misma validación en todas partes, será un excelente candidato para la capa empresarial.
A veces los controladores tienen sus propias reglas y condiciones que no se reproducirán en ninguna otra fachada. Entonces es un candidato para ser puesto en dicho controlador.
Piense en lo que está validando y si desea aplicarlo para todos sin importar qué. O si se trata de una validación contextual ("Estoy validando algo que solo sucede en una fachada de control / vista particular).
fuente
En nuestra tienda de Java, hemos dividido intencionalmente la validación de widgets web en tres operaciones separadas.
Si la capa 1 falla, no verificamos 2 o 3. De manera similar, si 1 tiene éxito y 2 falla, no hacemos 3. Esto detiene la generación de mensajes de error espurios.
Está preguntando acerca de los valores en una llamada REST en lugar de los contenidos del widget, pero se aplican los mismos principios.
fuente
Enfoque de prueba conducido a la luz sobre esto, después de todo no hay controlador y debe elegir otra opción. Obviamente, las reglas de negocio deben estar en un solo lugar, y esta es otra restricción en su decisión.
fuente