#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(...) {...} }
Комментариев нет:
Отправить комментарий