Бросать исключение в ваш @Service
нормально.ServletException
не супер значащий.Я бы предложил создать собственный класс Exception, расширяющий RuntimeException
, и выбросить его.
Таким образом, вы получите что-то вроде этого:
Контроллер, который вызывает толькосервисный метод (лучше не иметь никакой логики здесь)
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUserById(@PathVariable("id") Long id) {
return userService.getById(id);
}
}
A Service
класс, который вызывает DAO
класс (расширяющий JPARepository
)
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public User getById(Long id) {
return userDAO.findById(id).orElseThrow(() -> new UserNotFoundException("No user with id = " + id + " found."));
}
}
DAO:
@Repository
public interface UserDAO extends JpaRepository<User, Long> {
}
Примечание: возвращается Optional<Object>
, что очень удобно.
И, наконец, ваше Exception
класс.
@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
Примечание: @ResponseStatus
- при выдаче этого исключения будет возвращаться код состояния HTTP 404.
Это imho очень чистый и хороший способразвивайте свой отдых API.
Также посмотрите здесь: Как получить специальную ошибку вместо внутренней ошибки службы .Я ответил на вопрос, предоставив информацию, которая может оказаться полезной