Ответы пользователя по тегу Spring
  • Как отобразить картинку на сайте из MySQL используя Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день
    Вам необходимо byte{} перевести в base64.

    Чтобы получить массив байтов -
    String image = "this is base 64 image";
    byte[] photoByteArr = Base64.getDecoder().decode(String image);

    Чтобы получить base64
    String image = Base64.getEncoder().encodeToString(photo.getImage())

    А дальше гляньте, как вставить картинку в base64 - https://stackoverflow.com/questions/8499633/how-to...
    Ответ написан
    1 комментарий
  • Где выучить Spring Framework?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Вдобавок к тому, что указал коллега - https://www.youtube.com/watch?v=5ePo08sqcpk&list=P...
    Ответ написан
    2 комментария
  • Куда и как лучше перенести константу, из сервиса чтобы Spring находил её и подставлял в запрос?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Доброго дня.
    Соглашусь с коллегой. Вам необходимо константы хранить в properties || yml файле.
    Далее ознакомьтесь с такими аннотациями, как @Value и @ConfigurationProperties
    Ответ написан
    Комментировать
  • Как связать Spring Boot и React?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Доброго дня!
    Соглашусь с коллегой
    Лучше поднять фронт и бэк поотдельности.
    Притом, можете каждый из них засунуть поотдельности в докер. + добавить nginx.
    И будет вам счастье
    Ответ написан
    Комментировать
  • Как реализовать фильтр данных по критерию?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Конечно же есть... По факту вам нужно реализовать поиск.
    Если нужна готовая либа. то вот:
    https://github.com/tkaczmarzyk/specification-arg-r...

    Если хотите обойтись без либы, то расширьте репозиторий интерфейсом.
    JpaSpecificationExecutor<Book>
    А дальше можете передавать туда нужные спецификации (Specification)
    https://www.baeldung.com/rest-api-search-language-...
    Ответ написан
    Комментировать
  • 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
    Добрый день.
    Согласен с коллегой. Возможно. вам стоит рассмотреть вопрос о слиянии микросервисов или же о создании доп. микросервиса, у которого будет доступ к базе и данные будут согласованы (сага паттерн вроде должен подойти)
    Ответ написан
    Комментировать