Для улучшения обработки ошибок в ваших API методах, вам следует разработать более четкую и централизованную логику обработки ошибок. Это упростит код и сделает его более читаемым, а также обеспечит возврат конкретных и понятных сообщений об ошибках.
### Рекомендуемый подход:
1. **Создание пользовательских исключений.** Вы можете создать свои собственные классы исключений для каждой конкретной ошибки, например `InvalidIdException` и `InvalidDateException`.
2. **Обработка исключений в контроллере с помощью аннотации `@ExceptionHandler`.** Это позволит вам централизовать логику обработки ошибок.
3. **Возвращение детализированного ответа об ошибке через `ResponseEntity`.**
### Пример реализации:
**1. Создание пользовательских исключений:**
```java
public class InvalidIdException extends RuntimeException {
public InvalidIdException(String message) {
super(message);
}
}
public class InvalidDateException extends RuntimeException {
public InvalidDateException(String message) {
super(message);
}
}
```
**2. Изменение сервиса для выброса исключений:**
```java
public Map<String, Integer> changeDateStart(Date date_start, int id){
Map<String, Integer> map = new HashMap<>();
if (inkRepo.selfCheck(id) != null) {
throw new InvalidIdException("ID не верный");
}
if (date_start.before(inkRepo.findDateEnd(id))) {
throw new InvalidDateException("Дата начала не может быть раньше даты окончания");
}
long dura = myCompareDate.compare(date_start, inkRepo.findDateEnd(id));
inkRepo.changeDateStart(date_start, dura, id);
System.out.println(" успешно ");
return map; // Заполняйте ответ в зависимости от логики
}
```
**3. Обработка исключений в контроллере:**
```java
@RestController
@RequestMapping("/api/inks")
public class InkController {
@Autowired
private InkService inkService;
@PatchMapping("changestart/{id}")
public ResponseEntity<Object> changeDateStart(@PathVariable int id, @RequestBody InkDTO inkDTO) {
try {
Map<String, Integer> response = inkService.changeDateStart(inkDTO.getDate_start(), id);
return ResponseEntity.ok(response);
} catch (InvalidIdException e) {
return ResponseEntity.badRequest().body(Collections.singletonMap("error", e.getMessage()));
} catch (InvalidDateException e) {
return ResponseEntity.badRequest().body(Collections.singletonMap("error", e.getMessage()));
}
}
}
```
**4. (Опционально) Создание контроллера для обработки ошибок:**
Вы можете создать отдельный контроллер, который будет обрабатывать исключения.
```java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(InvalidIdException.class)
public ResponseEntity<Object> handleInvalidIdException(InvalidIdException e) {
return ResponseEntity.badRequest().body(Collections.singletonMap("error", e.getMessage()));
}
@ExceptionHandler(InvalidDateException.class)
public ResponseEntity<Object> handleInvalidDateException(InvalidDateException e) {
return ResponseEntity.badRequest().body(Collections.singletonMap("error", e.getMessage()));
}
}
```
### Заключение
С помощью описанных шагов ваш код станет более организованным и понятным. Теперь контроллер будет возвращать четкие сообщения об ошибках, а обработка исключений будет централизована и не будет загрязнять основной бизнес-логикой.