package com.billpaymentservice.bbps.exception; import java.util.*; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.*; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.*; import com.billpaymentservice.bbps.dto.ResponseModel; @ControllerAdvice public class GlobalExceptionHandler { private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity> handleValidation(MethodArgumentNotValidException ex) { List> fieldErrors = ex.getBindingResult().getFieldErrors() .stream() .map(fe -> Map.of("field", fe.getField(), "message", fe.getDefaultMessage())) .collect(Collectors.toList()); logger.warn("Validation failed: {}", fieldErrors); ResponseModel>> resp = new ResponseModel<>( "Validation failed for request", "FAILED", HttpStatus.BAD_REQUEST.value(), null ); // put validation errors into data or duplicate field in ResponseModel as required resp.setData(fieldErrors); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resp); } @ExceptionHandler(AppException.class) public ResponseEntity> handleAppException(AppException ex) { logger.warn("AppException: status={}, message={}", ex.getStatus(), ex.getMessage()); ResponseModel resp = new ResponseModel<>(ex.getMessage(), ex.getStatus(), ex.getStatusCode(), ex.getData()); return ResponseEntity.status(HttpStatus.valueOf(ex.getStatusCode())).body(resp); } @ExceptionHandler(CustomException.class) public ResponseEntity> handleCustomException(CustomException ex) { logger.warn("CustomException: {}", ex.getMessage()); ResponseModel resp = new ResponseModel<>( ex.getMessage(), "FAILED", HttpStatus.BAD_REQUEST.value(), null ); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resp); } @ExceptionHandler(Exception.class) public ResponseEntity> handleAll(Exception ex) { logger.error("Unhandled exception", ex); ResponseModel response = new ResponseModel<>( "Service temporarily unavailable. Please try again later.", "FAILED", HttpStatus.INTERNAL_SERVER_ERROR.value(), null ); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response); } }