Страницы

Поиск по вопросам

четверг, 27 февраля 2020 г.

Как обернуть вызов сервисов из рест-контроллера для отлова исключений?

#java #spring #jpa


Есть рест - сервис на spring:

@RestController
public class UserController {
    @Autowired
    private UserService service;

    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public Users add(@RequestBody Users users,
                              @RequestParam(value = "id", required = false) String id) {
        return service.add(id, users.getUsers());
    }

    @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    public @ResponseBody Users findById(@PathVariable(value = "id") String id) throws
Exception {
        return service.find(id);
    }
}


Который обменивается с клиентом с использованием xml и jaxb. При этом сущность Users
выглядит следующим образом:

@XmlRootElement(name = "Users")
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@Getter
@Setter
public class Users {
    @XmlElement(name = "users")
    private List Users;

    @XmlElement(name="UserError")
    private UserError error;

    public void appendUsers(Users Users){
        if (Users == null) return;

        if (Users.getError() != null){
            this.error = Users.getError();
        }

        if ( Users.getUsers() != null) {
            if (this.Users == null){
                this.Users = new ArrayList<>();
            }
            this.Users.addAll(Users.getUsers());
        }
    }
}


То есть, по сути, это два поля, в одном из котором хранится список пользователей,
в другом - ошибка если возникла.

В процессе выполнения service.add может возникнуть ошибка, например база данных оказалась
недоступна, и метод вернет exception.
Решением в лоб является обертка всех вызовов сервисов в try catch и, если возникло
исключение, запись этой ошибки в Users.error.

Есть ли более элегантное решение?
    


Ответы

Ответ 1



Конечно есть. Для того чтобы отловить ошибку, допустим, UserNotFoundException в UserController необходимо добавить метод с аннотацией @ExceptionHandler: @ExceptionHadler(UserNotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) @ResponseBody private String handleUserNotFoundException( UserNotFoundException ex) { return "user not found"; } Для того чтобы отловить ошибку, допустим, IllegalArgumentException изо всех RestController-ов необходимо обьявить класс с аннотацией @ControllerAdvice: @ControllerAdvice public class RestExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public String handleIllegalArgumentException(...) {...} }

Комментариев нет:

Отправить комментарий