Par contre faites attention à vos contrôleurs. Car il y a du code métier dans vos contrôleurs puisque vous n'exploitez pas bien les réponses HttpStatus et ResponseEntity
Voici un exemple de votre contrôleur avec du traitement métier
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
@PostMapping("/addCustomer")
public ResponseEntity<CustomerDTO> createNewCustomer(@RequestBody CustomerDTO customerDTORequest) {
//, UriComponentsBuilder uriComponentBuilder
Customer existingCustomer = customerService.findCustomerByEmail(customerDTORequest.getEmail());//pas besoin
if (existingCustomer != null) { //pas besoin
return new ResponseEntity<CustomerDTO>(HttpStatus.CONFLICT); // pas besoin, ce traitement doit être fait par le service qui gère la sauvegarde, il faut renvoyer directement l'exception depuis le service
}
Customer customerRequest = mapCustomerDTOToCustomer(customerDTORequest);
customerRequest.setCreationDate(LocalDate.now());
Customer customerResponse = customerService.saveCustomer(customerRequest);
if (customerResponse != null) {//idem, pas besoin
CustomerDTO customerDTO = mapCustomerToCustomerDTO(customerResponse);
return new ResponseEntity<CustomerDTO>(customerDTO, HttpStatus.CREATED);
}
return new ResponseEntity<CustomerDTO>(HttpStatus.NOT_MODIFIED);
} |
Voici un exemple de solution pour le service que je propose (Classe de gestion des exceptions à créer
CustomerResourceException):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public Customer saveOrUpdateCustomer(Customer customer) throws CustomerResourceException{
try{
return customerRepository.save(customer);
} catch(DataIntegrityViolationException ex){
logger.error("customer non existant", ex);
throw new CustomerResourceException("DuplicateValueError", "Un customer existe déjà avec le compte : "+customer.getLogin(), HttpStatus.CONFLICT);
} catch (CustomerResourceException e) {
logger.error("Utilisateur non existant", e);
throw new CustomerResourceException("CustomerNotFound", "Aucun utilisateur avec l'identifiant: "+customer.getId(), HttpStatus.NOT_FOUND);
} catch(Exception ex){
logger.error("Erreur technique de création ou de mise à jour de l'utilisateur", ex);
throw new CustomerResourceException("SaveOrUpdateUserError", "Erreur technique de création ou de mise à jour du customer: "+customer.getLogin(), HttpStatus.INTERNAL_SERVER_ERROR);
}
} |
Et voici ce que devient le contrôleur:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
@PostMapping("/addCustomer")
public ResponseEntity<CustomerDTO> createNewCustomer(@RequestBody CustomerDTO customerDTORequest) {
//, UriComponentsBuilder uriComponentBuilder
try{
Customer customerRequest = mapCustomerDTOToCustomer(customerDTORequest);
customerRequest.setCreationDate(LocalDate.now());
Customer customerResponse = customerService.saveCustomer(customerRequest);
CustomerDTO customerDTO = mapCustomerToCustomerDTO(customerResponse);
return new ResponseEntity<CustomerDTO>(customerDTO, HttpStatus.CREATED);
} catch (CustomerResourceException ex) {
//Traitez vos erreurs ici par un log si nécessaire
return new ResponseEntity<CustomerDTO>(ex.getHttpStatus()); //Ici tu gères à la fois plusieurs types d'erreurs comme HttpStatus.NOT_MODIFIED, HttpStatus.CONFLICT etc , au lieu de forcer la réponse à HttpStatus.NOT_MODIFIED uniquement
} catch (Exception ex) {
//Traiter les erreurs techniques ici par un log
return new ResponseEntity<CustomerDTO>(HttpStatus.INTERNAL_SERVER_ERROR); // un cas typique d'erreur ici serait une erreur liée au mapping, ou autres erreurs non gérées par le service
}
} |
Voici un exemple du constructeur de ton Exception
1 2 3 4 5
| public CustomerResourceException(String errorCode, String message, HttpStatus httpStatus) {
super(message);
this.errorCode = errorCode;
this.httpStatus = httpStatus;
} |
Note: Penser aux
getter/setter dans l'exception
Au final, pas besoin d'une requête supplémentaire
customerService.findCustomerByEmail(xxx) dans le
createNewCustomer car, en cas conflit, le service sait le code d'erreur à retourner
Bon courage !!!!
Partager