Есть рест - сервис на 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<User> 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.
Есть ли более элегантное решение?
Конечно есть. Для того чтобы отловить ошибку, допустим, 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(...) {...}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости