Ответы пользователя по тегу Spring
  • Хорошая ли идея использовать RestTemplate?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Можно ли так сделать? Да, можно. Лучше, конечно использовать OpenFeign для этого, ибо он удобнее (код пишется в декларативном стиле)
    Что можно еще сделать?
    1) можно коммуникацию сделать через асинхронный вызов (Webclient || Reactive OpenFeign)
    2) можно сделать коммуникацию через message brokers (RabbitMQ, Kafka, ActiveMQ). Как по мне более предпочтительный способ.
    Ну и можно еще через grpc реализовать.
    Ответ написан
    2 комментария
  • Существует ли обобщение контроллеров?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Если лень писать код, то попробуйте Spring Data REST. Там еще под капотом Spring HATEOAS. Он может сгенерировать для вас контроллеры. Вам нужно будет создать модели и добавить методы в репо
    Ответ написан
    Комментировать
  • Где взять GitHub с хорошим кодом для Spring / Spring Boot?

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

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.

    @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
        @JoinColumn(name = "id")
        private UserInfo userInfo;


    Так у вас FetchType.LAZY, потому данные и не подтягиваются. А OSIV у вас включен или отключен?

    P.S. не передавайте на фронт саму сущность. Используйте DTO.
    Ответ написан
    2 комментария
  • Как в Runtime загрузить содержимое JSP страницы?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Один из вариантов, который могу предложить, это использовать аякс.
    Отправляете ajax запрос на сервер, получаете содержимое файла и возвращаете на клиент. А дальше уже в success (done) добавляете append и содержимое вашего шаблона.
    api.jquery.com/jquery.ajax
    Ответ написан
    9 комментариев
  • JpaRepository: как убрать избыточный джойн в поиске при использовании entitygraph?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    EntityGraph сам по себе ничего не делает. Это уже поднаготная самого Hibernate.
    https://stackoverflow.com/questions/26769989/hiber...

    Может какой то параметр есть для этого или аннотация?

    Такого параметра нет.

    Вот, полезная статья по этой теме - https://thorben-janssen.com/5-common-hibernate-mis...

    Для поиска я бы рекомендовал использовать Specification<T> & Criteria API. А на больших проектах тут уже использовать Hibernate Search, ElasticSearch, Apache Lucene
    Ответ написан
    Комментировать
  • Есть ли пример расширяемого приложения на базе Spring для клиентов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вам по факту нужен базовый функционал + возможность установки плагинов.
    Благо у спринга есть готовый фреймворк
    https://github.com/spring-projects/spring-plugin
    Ответ написан
    Комментировать
  • Как создавать связанные сущности через 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 комментарий