Ответы пользователя по тегу Spring
  • Как создавать связанные сущности через RESTController?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Начнем с самого начала.
    Рекомендую в первую очередь реализовать энтерпрайз паттерн DTO.
    Создаете модель, которая описывает вашу сущность и которую планируете получать в контроллере для создания и отправлять ответ после создания.
    Желательно называть их понятным образом.
    Допустим, у вас есть entity - Event. EventCreationRequest, EventCreationResponse, EventDTO, EventUpdatingRequest и т.д.
    Конечно же, вам нужно маппить данные между Event -- EventDTO.
    Можно по-разному реализовать.
    Есть готовые либы - MapStruct, ModelMapper, JMapper и др. Я предпочитаю использовать MapStruct или ModelMapper.
    https://www.baeldung.com/spring-type-conversions
    Если не хотите либу, то используйте интерфейс Converter<S,T> содержащийся в Spring. Он принимает 2 дженерика - source & target.
    Например,
    EventDTOMapper implements Converter<EventDTO, Event>

    Отмечу, что для nested classes тоже стоит создать DTO.

    Далее касаемо @PostMapping("") можно не указывать скобки, а просто @PostMapping.

    return ResponseEntity(created, HttpStatus.OK)
    можно более сокращенно ResponseEntity.ok(created);

    Следуя документации, hibernate должен сам подтягивать по id нужный Subject из бд, но он этого не делает, ругаясь на отсутствие конструктора.

    Отмечу, что каждая сущность должна иметь коструктор без аргументов.
    В kotlin для spring есть соответствующие плагины, которые нужно подключать. (читаем документацию)
    Ответ написан
    Комментировать
  • Как перенаправлять авторизованных пользователей на домашнюю страницу?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Давно писал вот, такой код.
    Должен сработать.

    @GetMapping("/")
      public String homepage(Model model) {
    
        // Проверяем авторизован ли пользователь и если авторизован, то редиректим его в /dashboard
        if (SecurityContextHolder.getContext().getAuthentication() != null
            && SecurityContextHolder.getContext().getAuthentication().isAuthenticated()
            && !(SecurityContextHolder.getContext().getAuthentication()
                instanceof AnonymousAuthenticationToken)) {
    
          return "redirect:/dashboard";
        }
    
        return "index";
      }
    Ответ написан
    2 комментария
  • Почему в Spring Security роли нужно писать с приставкой ROLE?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    На самом деле необязательно писать ROLE_
    Все зависит от метода, который вы используете. Если используете hasAuthority, то при проверке вам нужно к роли добавить ROLE. Например, hasAuthority("ROLE_ADMIN") Если же используете hasRole("ADMIN")
    Role является разновидностью authority
    Ответ написан
    Комментировать
  • Какую книгу взять новичку в разработке микросервисов на Spring Framework?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Если хотите быстро войти в курс дела, то можете глянуть курсы на Udemy.
    Например, у Сергея Каргополова есть курс по микросервисам на английском. А так разумеется, что для академических знаний книга не помещает.

    `Java в Облаке Джоша Лонга` не рекомендую. Это скорее даже рекламная книжка компании Pivotal, нежели что-то академическое.

    Микросервисы spring в действии. можно прочитать
    Ответ написан
    2 комментария
  • Hibernate не видит entity. Как пофиксить?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый вечер.
    А кто пропишет в файл конфигурации, что этот класс является entity?)

    Обратите внимание на эту строку -
    <mapping class="hibernate.entity.User"/>

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="connection.url">jdbc:mysql://localhost:3306/spring_course</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.username">root</property>
            <property name="connection.password">springcourse</property>
            <property name="current_session_context_class">thread</property>
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="show_sql">true</property>
           
             <mapping class="hibernate.entity.User"/>
        </session-factory>
    </hibernate-configuration>
    Ответ написан
  • Hibernate не видит entity?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Недавно столкнулся с похожей ситуацией, когда один и тот же проект работал на моем ноуте, а в ноуте коллеги нет. Там правда, была проблема в rabbitmq.
    Как именно вы поднимаете БД? Если в докере, то попробуйте разные образы. Проверьте создается ли БД, есть ли нужные привилегии у пользователя и т.д. Может быть проблема даже не в коде...
    Ответ написан
    Комментировать
  • Как оптимизировать задачу?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Может быть есть смысл подключить spring batch или spring quartz? И обрабатывать параллельно
    Ответ написан
  • Как ускорить процесс получения большого объема данных?

    azerphoenix
    @azerphoenix Автор вопроса, куратор тега Java
    Java Software Engineer
    Проблему решил путем применения Spring Batch.
    Ответ написан
    Комментировать
  • Есть ли инструменты для отслеживание памяти для Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Доброго времени суток.
    Есть много разных инструментов, в том числе, как коллега подсказал visualVM.
    Если используете İntellij İDEA, то в него встроены некоторые инструменты для профайлинга.
    Если вам необходимо провести удаленный профайлинг, то можете еще воспользоваться возможностями удаленного дебага (Intellij IDEA -> Remote JVM debug)
    Ответ написан
    Комментировать
  • Зачем нужен WebFlux?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Чем хорош вебфлакс... асинхронностью.
    По своему опыту скажу, что он имеет преимущества в плане отзывчивости перед вебом.

    Пока не вижу кейсов, при которых не хватало SpringBoot, либо MicroProfile-фреймворков.

    Уж поверьте, когда понадобится, тогда увидите нужные кейсы.

    Мне например, приходилось разрабатывать приложение, который на вход принимает огромное количество точек (более 1000), строит маршруты и возвращает инструкции. Тав вот, асинхронно (flux) я возвращал данные по мере готовности. А если вы работаете с БД, то можете вместо jdbc подключить r2dbc.
    Ответ написан
    Комментировать
  • Как спроектировать отправку данных по консюмерам?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Есть API, Который принимает на вход ID платежа. Далее кроном ходит бд и вытягивает по ID детали платежа
    (сумма, реквизит и т.п) и присваивается статус: NEW.

    Попробуйте фреймворк spring quartz. Или spring batch. С их помощью можно реализовать то, что вы хотите
    Ответ написан
    Комментировать
  • Подскажете по архитектуре "мультисервисного" приложения?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Приложение будет предоставлять несколько WEB-сервисов, за каждый будет отвечать отдельный микросервис :) Но все они будут обращаться к одной базе данных.

    Может быть вам нужны не микросервисы, а distributed monolith? Ну и реализовать паттерн shared database access

    Я хочу сделать микросервис (или модуль?), который абстрагирует БД. Т.е. он умеет читать (пока только читать, а в перспективе и писать, и кэшировать запросы) записи из БД и раздавать их другим частям приложения. Все остальные части ничего не знают про БД, а пользуются готовыми объектами.

    Тут можно и про SAGA задуматься.

    Но допустим, у меня БД на 1000 таблиц (плюс ещё таблицы взаимосвязаны что порождает вложенные Java-объекты). Это значит, мне надо сделать 1000 репозиториев, в каждом Х методов (получение по ID, получение по значению поля, одного объекта, коллекции...). И ещё 1000*Х методов в контроллерах....

    Честно, не уловил сути между количеством таблиц в БД и количеством репозиториев. Но если что можно же монорепо сделать.

    Думаю, вам не нужны микросервисы. Вам понадобится monolith, ну или максимумdistributed monolith.
    Много чего можно вынести в отдельные модули. Например, создать модуль persistence и вынести DAO туда
    Ответ написан
    2 комментария
  • Как отобразить картинку на сайте из 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

    Дальше профилирование, возможно вертикальное расширение.
    Ответ написан
    Комментировать