Форум программистов, компьютерный форум, киберфорум
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. Показов 4360. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru