Ответы пользователя по тегу Spring
  • Could not commit JPA transaction. Как исправить?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Доброго времени суток!
    1)
    ConstraintViolationException: Validation failed for classes

    Судя по всему у вас есть некий constraint, который был нарушен и потому объект не был сохранен.
    Попробуйте подебажить этот момент: Скорее всего проблема тут.
    @Getter
        @Setter
        @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
        @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
        @Enumerated(EnumType.STRING)
        private Set<Role> roles;


    Некоторые рекомендации не связанные с вопросом:
    2) рекомендую ознакомитсья с паттерном DTO. Вам нужно принять DTO, замаппить его в Entity. Это более корректный способ.
    3) нет смысла дублировать @Getter @Setter, если эти аннотации стоят над каждым полем. Попробуйте перенести его на уровен класса.
    4)
    Ответ написан
    Комментировать
  • Почему liquibase не работает в docker?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Вариантов может быть несколько.
    Например, вы указали некорректный путь до БД в конфигах liquibase. Как вариант, вы могли указать localhost вместо названия самого докер контейнера в jdbc url или еще что...
    Ответ написан
    Комментировать
  • Как снизить нагрузку на API?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Клиент отправляет файл в апи и на стороне создаётся задача, далее клиенту передается идентификатор задачи по которому он будет время от времени спрашивает прогресс обработки.

    Посмотрите в сторону:
    - Spring Quartz
    - Spring Batch
    - Spring Webflux
    - DeferredResult

    Дальше профилирование, возможно вертикальное расширение.
    Ответ написан
    Комментировать
  • Как обновить большие данные в Hibernate?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Читать все данные из БД разом в List<Foo> или любую другую коллекцию не самая лучшая идея.
    Соответственно, можно вместо коллекций использовать стримы.
    Т.е. Получить Stream<Foo>

    Пример,
    FooRepository {
    
    @QueryHints(value = {
                @QueryHint(name = HINT_FETCH_SIZE, value = "1000"),
                @QueryHint(name = HINT_CACHEABLE, value = "false"),
                @QueryHint(name = READ_ONLY, value = "true")
        })
        @Query(value = "SELECT DISTINCT f FROM Foo f")
        @Transactional(readOnly = true)
        Stream<Foo> findFoos();
    
    }


    Ну а дальше остается распараллелить стрим при помощи parallelStream()
    И произвести необходимые операции. Например, вызвать метод map() и в конце сохранить...

    Если нужно данную операцию производить периодически, то к методу, который будет производить операцию, добавьте @Async и используйте @Scheduled (или возможности Spring Batch, Spring Quartz)

    Для более подробного ответа нужно больше информации.
    Ответ написан
  • Как правильно передать данные между микросервисами spring?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Если это учебный проект, то можете поиграться с amqp для начала. Возьмите например, rabbitMQ и покопайтесь в нем. Можете глянуть на оркестрацию микросервисов. Обратите внимание на паттерн SAGA
    https://www.baeldung.com/cs/saga-pattern-microservices
    https://www.vinsguru.com/orchestration-saga-patter...
    Ответ написан
  • Как автоматически создавать базу данных Spring?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Ну я бы посоветовал создать несколько профилей.
    Например, dev & prod.
    В dev вы можете делать, что хотите. Например,
    spring.jpa.hibernate.ddl-auto = update (или create)

    А вот, в prod лучше установить
    spring.jpa.hibernate.ddl-auto = none (или validate)
    и воспользоваться возможностями миграции БД. Например, flyway или liquibase. Если нужен простой вариант, то flyway. Но я бы рекомендовал liquibase.
    Ответ написан
    1 комментарий
  • Spring JPA, как обновить данные в модальном окне?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    th:href="@{findOne/(id=${tour.id})}"
    Глянув на этот участок кода могу сказать следующее - не передавайте саму сущность на фронт. Вместо этого используйте паттерн DTO. Т.е. для создания / обновления используйте DTO, который затем в сервисном слое маппите в entity и сохраняете в БД,
    Для маппинга можно использовать разные либы.
    Например, интерфейс Converter<S, T> или же либу MapStruct, ModelMapper и др.
    Также можно использовать BeanUtils.copyProperties() например, для обновления сущности.

    @ResponseBody
        public Tour findOne(Integer id) {
            return tourRepository.findById(id).get();
        }

    Вместо get() лучше использовать например, orElseThrow() и выбросить исключение, которое впоследствиее можно при помощи ExceptionHandler обработать и вернуть корректный http ответ. Например, когда объект не найден (404)

    @Autowired
        private TourRepository tourRepository;
        @PostMapping("/save")
        public String save(@ModelAttribute(name = "tour") Tour tour) {
            tourRepository.save(tour);
            return "redirect:/";
        }
        @PostMapping("/admin/saveTour")
        public String saveTourInModal(@ModelAttribute(name = "tour") Tour tour) {
            tourRepository.save(tour);
            return "redirect:/admin/tourList";
        }

    Нет смысла в двух одинаковых методах внутри одного контроллера. Есть смысл вынести эндпоинты отвечающие за админку в отдельный контроллер.

    Само модальное окно вызывается и заполняется данными объекта. После нажатия на кнопку сохранения, у меня стало выводить исключение org.hibernate.exception.ConstraintViolationException: could not execute statement, и что поля бд title и description не могут быть null.

    Вопрос в том, почему они были null, если вы делаете сабмит формы. Попробуйте глянуть в консоли браузера во вкладке "Сеть", какие именно данные отправляются в бэк. Также в режиме дебага проверьте, что именно вы принимаете и сохраняете в БД.

    Обратите внимание, что на одной странице вы делаете update
    Hibernate: update tour set description=?, end_time=?, image=?, price=?, start_time=?, title=? where code=?

    А на другой странице insert
    Hibernate: insert into tour (description, end_time, image, price, start_time, title) values (?, ?, ?, ?, ?, ?)


    Для более точного ответа нужен исходник проекта, ибо я не вижу кода сущности
    Ответ написан
    Комментировать
  • Как работать с WSDL SOAP в Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Есть хорошая статья по вашему вопросу:
    https://www.baeldung.com/spring-soap-web-service
    Не читали случайно?
    Ответ написан
    Комментировать
  • Как обновит массив объектов в spring boot?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну во-первых, вам не нужно итерировать по старой и новой коллекции.
    Вы можете либо воспользоваться методом addAll(). либо же раз решили итерировать, то
    создать методы add() и remove()
    Прочитайте эту статью:
    https://vladmihalcea.com/the-best-way-to-map-a-one...
    Для более полного ответа нужно увидеть весь код. Например, вы указали вот, эту строку в комментарии:
    List<Address> addressList = oldUser.getAddress()
    Тут либо действительно проблема. либо метод назван неправильно, так как getAddress() подразумевает получение одного адреса, а не списка адресов пользователя. Должно быть getAddresses(), ну а метод getAddress() должен возвращать 1 адрес
    Рекомендую поставить брейкпоинты и провести дебаг
    Ответ написан
    Комментировать
  • Возможно ли поместить в option selected Значение переменной из Thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    <option selected>Как сюда поместить значение  переменной Thymeleaf??</option>
            <option th:each="ru: ${rule}"
                    th:value="${ru.id}"
                    th:text="${ru.name}">
            </option>

    Тут нужно сделать проверку при помощи th:selected
    https://attacomsian.com/blog/thymeleaf-conditional...
    Если я вас правально понял. то атрибут selected нужно добавить, если значение из цикла совпадает со значением из вашей переменной (допустим из БД)?
    Если так, то в цикле th:each вы при помощи th:selected проверяете на совпадение и если значение переменной и элемента из цикла совпадают, то добавляете атрибут.
    Ответ написан
    5 комментариев
  • Как одну сущность использовать в нескольких таблицах?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Было бы неплохо увидеть стек.
    А так попробуйте:

    class Rate {
    
    	@ManyToOne(fetch = FetchType.LAZY)
        private Tarif tarif;
    
        @ManyToOne(fetch = FetchType.LAZY)
        private TarifGarant tarifGarant;
    }
    
    class Tarif {
    
    	@OneToMany(
            mappedBy = "tarif",
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
        private List<Rate> rates;
    
    }
    
    class TarifGarant {
    
    	@OneToMany(
            mappedBy = "tarifGarant",
            cascade = CascadeType.ALL,
            orphanRemoval = true
        )
        private List<Rate> rates;
    }
    Ответ написан
  • Как ограничить доступ пользователю к чужим постам на сайте?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Как отметил коллега, в первую очередь вам нужно связать пользователя и его посты.
    Рекомендую ознакомиться со связями между сущностями. (OneToOne, OneToMany & ManyToOne, ManyToMany). Затем связать пользователя и его посты при помощи OneToMany & ManyToOne. Таким образом на стороне поста у вас будет ID пользователя, который его добавил.
    Далее в контроллерах, вам необходимо получить текущего авторизованного пользователя и проверить принадллежит ли пост этому пользователю или нет. Если нет, то показываем 403. Тут уже зависит от вашей задумки. Можно по-разному проверить и по-разному реализовать
    Ответ написан
    1 комментарий
  • Может ли одно Java-приложение работать с разными БД?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Что за приложение. которое работает по принципу "1 сервер - 1 клиент". А если в будущем будет 1000 клиентов? А если 1М?
    Ну а так вы можете перейти на микросервисную архитектуру. Развернуть отдельный сервер конфигурации (config server), gateway & discovery service. А затем развернуть по 1 инстансу приложения на каждого клиента
    Ну или как отметил коллега, реализовать мультиарендность (multitenancy)
    Ответ написан
  • Как исправить ошибку 405 при отправке Post запроса через Rest, ajax в Spring проекте?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Сделал код ревью вашего кода и дам вам несколько советов, если конечно вы не против:
    1) Обратите внимание на структуру REST запроса. Есть общепринятые стандарты наименования эндпоинтов, которым было бы неплохо следовать:
    @PostMapping("/cart/add/{pid}/{qty}")
    2) Вместо System.out.println("authentication is null"); используйте логгер. Ознакомьтесь с @Slf4j например.
    3) Нет смысла использовать PostMapping, если у вас нет тела запроса. Для этих целей допустимо использование PatchMapping, как вариант. Либо отправьте Post запрос, но с телом. Вообще, рекомендую прочитать про идемпотентность методов и вообще про методы.

    Ответ на ваш вопрос в 3-м пункте
    Ответ написан
    Комментировать
  • Как можно реализовать пагинацию в Java, в том случае, когда данные для фильтрации должны браться из двух разных микросервисов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Согласен с коллегой. Возможно. вам стоит рассмотреть вопрос о слиянии микросервисов или же о создании доп. микросервиса, у которого будет доступ к базе и данные будут согласованы (сага паттерн вроде должен подойти)
    Ответ написан
    Комментировать
  • Какой хостинг лучше использовать для spring приложения?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Если приложение действительно простое, то подойдет любой VPS / VDS.
    Однако, замечу, что было бы неплохо провести профилирование и глянуть на объем потребляемой оперативной памяти и т.д.
    Также при выборе хостинга стоит учесть тот факт, что могут быть проблемы с оплатой услуг зарубежных провайдеров. А так я бы посоветовал Hetzner (немецкий) из разряда дешево-сердито.
    Ответ написан
    Комментировать
  • Где взять тексты сообщений и ошибок Java + Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Ну во-первых, давайте не путать ошибки и исключения. Также не стоит путать их с http ошибками.
    Ошибка - StackOverflowError
    Исключение - NullPointerException, RuntimeException
    Подскажите пожалуйста, где можно взять список всех ошибок и сообщений для Java?

    Гиблое дело, ибо каждая либа может создавать свои кастомные исключения. Даже в Spring вы можете расширить класс RuntimeException и создать свое кастомное исключение.
    Одним списком вы не найдете. Будут куча разных списков в лучшем случае... на каждую либу / фреймворк. А найти их можно на оф. сайте либы
    Ответ написан
    Комментировать
  • Каким образом сделать повторную аутентификацию с JWT?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    На мой взгляд должно быть 2 токена: refresh token и access token.
    Первый токен используется для обновления второго токена и отсылается в запросе.
    Второй токен используется для авторизации.
    Соответственно, при обновлении логина перекинуть его на страницу входа. И после ввода логина и пароля вернуть на клиент 2 токена и сохранить в localStorage
    Ответ написан
    2 комментария
  • Как сделать, чтобы при существующем объекте в модальном окне Bootstrap отображались его поля(Spring)?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    При клике на кнопке Show вам необходимо отправить ajax запрос на сервер и получить информацию об объекте в json формате.
    Затем полученный объект распарсить и вставить в соответствующие поля.
    Чтобы отправить ajax запрос смотрите на:
    https://api.jquery.com/jquery.get/
    https://api.jquery.com/jquery.ajax/
    Дальше уже дело техники...
    Чтобы вернуть ответ в json используйте либо @RestController или же @ResponseBody, если используете @Controller

    Судя по вашему коду, вы все правильно сделали. А в чем именно ошибка или проблема?
    Ответ написан
  • Как избавиться от No 'Access-Control-Allow-Origin' header is present on the requested resource?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Так там написано, что нет заголовка "Access-Control-Allow-Origin".
    Полезное чтиво - https://www.baeldung.com/spring-cors
    https://spring.io/guides/gs/rest-service-cors/
    Ответ написан
    Комментировать