Estou criando uma API Rest usando o Spring Boot e estou usando a Hibernate Validation para validar entradas de solicitação.
Mas também preciso de outros tipos de validação, por exemplo, quando os dados de atualização precisam ser verificados, se o ID da empresa não existir, quero lançar uma exceção personalizada.
Essa validação deve estar localizada na camada de serviço ou na camada do controlador?
Camada de serviço:
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);
}
Camada do 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);
}
fonte
As validações de hibernação são verificações da integridade dos dados. Para evitar RuntimeExceptions do bbdd. Elas são praticamente as mesmas validações que você deve controlar com o Constrains . Como apenas a camada de negócios deve alimentar a camada de persistência, você pode (ou não, até você) confiar na correção dos dados provenientes da camada de negócios
Eu não coloco validações em DAOs. Espero dados válidos das camadas superiores. Em caso de erro, delego ao bbdd a responsabilidade de estar ciente de seu conteúdo.
Em seguida, vêm as validações na camada de negócios. Todas as validações de negócios se concentraram em manter a coerência dos dados, não sua integridade .
Finalmente, faço validações anteriores na camada de controle. Aqueles relacionados apenas com essa camada.
Você verá em breve quais validações devem ser implementadas na camada de negócios. O mais comum: controle de identificação. Este pode ser facilmente implementado em ambas as camadas. Se você espera ter muitos controladores ou clientes consumindo sua camada de negócios, em vez de repetir a mesma validação em todos os lugares, será um excelente candidato a ser colocado na camada de negócios.
Às vezes, os controladores têm suas próprias regras e condições que não serão reproduzidas em nenhuma outra fachada. Em seguida, é um candidato a ser colocado em tal controlador.
Pense no que você está validando e se deseja aplicá-lo a todos, não importa o quê. Ou se for uma validação contextual ("Estou validando algo que só acontece em uma fachada de controle / exibição específica).
fonte
Em nossa loja Java, dividimos intencionalmente a validação de widget da web em três operações separadas.
Se a camada 1 falhar, não marcaremos 2 ou 3. Da mesma forma, se 1 for bem-sucedido e 2 falhar, não ocorreremos 3. Isso interrompe a geração de mensagens de erro espúrias.
Você está perguntando sobre valores em uma chamada REST em vez do conteúdo do widget, mas os mesmos princípios se aplicam.
fonte
Uma abordagem orientada a testes esclarece isso, afinal, não há controlador e você deve escolher outra opção. Obviamente, as regras de negócios devem estar em um só lugar, e essa é outra restrição à sua decisão.
fonte