Что ж, если срок действия date_expiration
истек или identification_card
не относится к клиенту, это провал бизнеса.
Мне нравится представлять бизнес-ошибки с HTTP 422 - Unprocessable Entity
. См. здесь
Вы можете изменить возвращаемый объект с ResponseEntity<CreditCard>
на ResponseEntity<Object>
, если хотите вернуть различные объекты в свой контроллер, хотя я предпочитаю использовать ExceptionHandler
вControllerAdvice
аннотированный метод, если целью является возвращение ошибок.
Как я уже сказал, эта ситуация является бизнес-ошибкой (срок действия кредитной карты истек или она не относится к текущему пользователю).
Вот пример. Было бы что-то вроде этого:
CardService.java
@Service
public class CardService {
// ..
public CreditCard registerCard(CreditCard card) throws BusinessException {
if(cardDoesntBehaveToUser(card, currentUser()))) // you have to get the current user
throw new BusinessException("This card doesn't behave to the current user");
if(isExpired(card)) // you have to do this logic. this is just an example
throw new BusinessException("The card is expired");
return cardRepository.save(card);
}
}
CardController.java
@PostMapping("/card")
public ResponseEntity<Object> payCard(@Valid@RequestBody CreditCard creditCard) throws BusinessException {
CreditCard creC = cardService.registerCard(creditCard);
return ResponseEntity.ok(creC);
}
BusinessException.java
public class BusinessException extends Exception {
private BusinessError error;
public BusinessError(String reason) {
this.error = new BusinessError(reason, new Date());
}
// getters and setters..
}
BusinessError.java
public class BusinessError {
private Date timestamp
private String reason;
public BusinessError(String Reason, Date timestamp) {
this.timestamp = timestamp;
this.reason = reason;
}
// getters and setters..
}
MyExceptionHandler.java
@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {
// .. other handlers..
@ExceptionHandler({ BusinessException.class })
public ResponseEntity<Object> handleBusinessException(BusinessException ex) {
return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(ex.getError());
}
}
Если срок действия кредитной карты истек, JSON будет отображаться как:
{
"timestamp": "2019-10-29T00:00:00+00:00",
"reason": "The card is expired"
}