Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 18

Исключения при использовании Spring Data Jpa

06.04.2018, 17:01. Показов 4412. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Пишу приложение с использование Spring Boot и Data Jpa. Столкнулся с одной особенностью.
Допустим я в своём сервисе вызываю метод repository.getOne(id) и хочу в случае если такого нет, выбросить свой экзепшн со своим сообщением юзеру и тд
Java
1
2
3
4
5
6
7
8
    @Override
    public Users getOne(Integer id) {
        Users user = repository.getOne(id);
        if (user == null) {
            throw new CustomException();
        }
        return repository.getOne(id);
    }
Сейчас данный код не сработает, тк спринг выбрасывает HttpMessageNotWritableException экзепшн раньше меня. (Try/catch тоже не срабатывает) При этом например если я буду проверять только поле юзера всё сработает, к примеру:
Java
1
if(user.getName() == null) //...
Я нашёл два способа решения этой проблемы:
1. Использовать @ExceptionHandler и передавать в него HttpMessageNotWritableException(Но это не решает проблему с тем что я хочу выбросить свой экзепшн)
2. Использовать класс Optional:
Java
1
2
3
4
5
6
7
8
@Override
    public Optional<Users> getOne2(Integer id) {
        Optional<Users> user = repository.findById(id);
        if (!user.isPresent()) {
            throw new CustomException();
        }
        return user;
    }
Но всё же, есть ли способ без использования Optional и конкретного экзепшна в хэндлере? Если бы можно вместо него обрабатывать свой, то это бы подошло тоже. Заранее всем спасибо)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2018, 17:01
Ответы с готовыми решениями:

Ошибка в UserServiceTest (spring data jpa)
Использую spring data jpa. При написании теста для UserService возникает ошибка. Не пойму как исправить. spring-config.xml ...

In-Memory databases с Spring MVC, JPA
Пытаюсь настроить соединение с in-memory БД в Spring MVC: &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;beans...

Dbunit test with spring data
Есть конфиг бд и тест @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages =...

12
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
06.04.2018, 17:03
что-то какая-то дичь. Не пробовали сначала разобраться почему эксепшен кидается?
0
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 18
06.04.2018, 17:41  [ТС]
Пробовал, особо ничего не нашёл, видимо это стандартный механизм спринга при таких ситуациях
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
06.04.2018, 17:51
Цитата Сообщение от Ruslan17 Посмотреть сообщение
вызываю метод repository.getOne(id)
Цитата Сообщение от Ruslan17 Посмотреть сообщение
выбрасывает HttpMessageNotWritableException экзепшн
Цитата Сообщение от Ruslan17 Посмотреть сообщение
видимо это стандартный механизм спринга
конечно....всем известно что спринг писали полные наркоманы и когда они не могут найти ентити в БД они кидают ошибку что http сообщение невозможно записать.

Добавлено через 43 секунды
Цитата Сообщение от Ruslan17 Посмотреть сообщение
Try/catch тоже не срабатывает
да ещё и JVM хакнули
0
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 18
06.04.2018, 22:37  [ТС]
Ну тогда объясните в чём проблема? Код состоит из модели, репозитория наследующегося от JpaRepository, сервиса, который я уже скинул и контроллера. Собственно всё. Так что не думаю, что данный экзепшн вылетает из-за моих ошибок. А про то что try/catch не работает, я имел в ввиду, что в нём тоже не выбрасывается нужный мне экзепшн. Вы бы лучше помогли советом, если знаете в чём проблема.

Добавлено через 6 минут
#Could not write JSON: Unable to find application.model.Users with id 3; nested exception is com.fasterxml.jackson.databind.JsonMappi ngException: Unable to find application.model.Users with id 3 (through reference chain: application.model.Users_$$_jvst260_0["name"])
2018-04-06 17:17:21.759 WARN 31468
--- [nio-7373-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.http.converter.HttpM essageNotWritableException: Could not write JSON: Unable to find application.model.Users with id 3; nested exception is com.fasterxml.jackson.databind.JsonMappi ngException: Unable to find application.model.Users with id 3 (through reference chain: application.model.Users_$$_jvst260_0["name"])

Вот логи с бэка, если кому то интересно

Добавлено через 4 часа 13 минут
Извиняюсь,я неправильно выразился, ошибка не выбрасывается, а обрабатывается спрингом, возможно из-за этого вы не так меня поняли,я привел выше логи
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
07.04.2018, 10:03
Цитата Сообщение от Ruslan17 Посмотреть сообщение
Unable to find application.model.Users with id 3
Цитата Сообщение от Ruslan17 Посмотреть сообщение
through reference chain: application.model.Users_$$_jvst260_0["name"]
покажите код репозитория и энтити юзера
0
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 18
07.04.2018, 10:14  [ТС]
Репозиторий:
public interface UserRepository extends JpaRepository<Users, Integer> {}
Энтити:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Users implements Serializable {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Integer id;
 
    private String name;
 
    private String age;
 
}
Верхние аннотации это ломбок, JsonIgnoreProperties добавил потому что вылетала такая ошибка:
com.fasterxml.jackson.databind.exc.Inval idDefinitionException: No serializer found for class org.hibernate.proxy.pojo.javassist.Javas sistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS ) (through reference chain: application.model.Users_$$_jvstb7c_0["handler"])

И заодно контроллер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@RequestMapping("api/user")
public class UsersController {
private UserRepositoryService repositoryService;
   @Autowired
    public UsersController(UserRepositoryService service1) {
        this.repositoryService = service1;
    }
 
    @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    public Users getUserById(@PathVariable Integer id) throws CustomException {
        return repositoryService.getOne(id);
    }
}
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
07.04.2018, 22:42
Ruslan17, не отдавайте ентити на клиент. Делайте маппинг в DTO объекты. Все джсон и ломбок аннотации удалите из ентити. Ломбок вообще лучше выкинуть нах
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.04.2018, 22:50
ага, и хибернейт выкинуть, и спринг заодно
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
08.04.2018, 08:20

Не по теме:

KEKCoGEN, не гони на lombok))) отличная либа, если знать как пользоваться



Ruslan17, сделай как советуют, dto+маппинг в обе стороны
0
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 18
08.04.2018, 11:39  [ТС]
Окей, а в чём преимущество именно данного подхода и в чём минусы отдавать сразу юзера?

Добавлено через 19 минут
Потому что я не нашёл однозначного ответа когда лучше использовать DTO и использовать ли его вообще

Добавлено через 11 минут
Я так понял с одной стороны можно в ДТО мэппить только нужные мне поля, а с другой это получается копипаст энтити во многом?
И если я прав то следует ли использовать ДТО только для ответов клиенту, а в остальном юзать энтити?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.04.2018, 12:36
Лучший ответ Сообщение было отмечено Ruslan17 как решение

Решение

Цитата Сообщение от Ruslan17 Посмотреть сообщение
Окей, а в чём преимущество именно данного подхода и в чём минусы отдавать сразу юзера?
не все поля должны быть доступны клиенту
некоторые поля получаются после манипуляций с данными
работать с энтити вне транзакции не рекомендуется (в том числе из за странных ошибок которые вы получаете)

Цитата Сообщение от Ruslan17 Посмотреть сообщение
использовать ДТО только для ответов клиенту, а в остальном юзать энтити?
верно в 90% случаев

Цитата Сообщение от Ruslan17 Посмотреть сообщение
получается копипаст энтити во многом
используйте projection тогда копипасты практически не будет.
1
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 18
08.04.2018, 14:09  [ТС]
Спасибо, про projection весьма интересно, попробую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.04.2018, 14:09
Помогаю со студенческими работами здесь

Spring Data custom query error
Добрового времени суток, у меня есть следующий код: public interface CarDao extends CrudRepository&lt;Car, Long&gt;{ @Modifying ...

Spring data - ошибка создания сервиса
Всем привет кодеры. Решил я стать модным чуваком и попробовать спринг дату. Но она меня совсем не жалеет. Видимо нельзя так просто стать...

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями Spring MVC проект собирается нормально и...

QueryDSL и Spring Data JPA
Начал изучать querydsl. Делал по одному примеру. Там из такого запроса: http://localhost:8080/users?search=lastName:doe,age&gt;25 ...

Выборка данных из нескольких таблиц используя Spring Data JPA Repository и преобразование в json
Всем привет! Сейчас мне данные отдаются в таком виде: Эти данные берутся из одной таблицы public_organisations. Но есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru