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

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Контроллеры пишутся не "для сущностей", это точки входа в твой сервер, которые все вместе образуют API.
    Иногда эти точки однозначно мапятся на сущности (например, "получить список пользователей"), иногда нет.
    Ответ написан
    Комментировать
  • Как тестировать работу Service класса с базой данных или как сравнить два JPA entity объекта в тестах?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Когда ты реализуешь equals() и hashCode(), логику этих методов ты определяешь сам, тебе не обязательно сравнивать все поля. Сравнивать то что тебе надо и так как надо - хоть фазу Луны со спином ретроградного Меркурия.
    Ответ написан
    Комментировать
  • Как добавить в feign client url из .properties?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Не очень понятно: проект на Spring? Если да, то:
    1. Прочитать файл. Сделать MAP, выгрузить его в контекст через @ Bean. Если без Spring, то то же самое, но вместо бина сделать синглтон и к нему обращаться, получится что-то вроде глобальных констант.
    2. Сделать application.properties (по-моему, они могут работать параллельно с .YML, но это надо проверить) и подключить туда другие .properties. @ Value будет работать.
    Ответ написан
  • Как сделать фильтр в виде checkbox`ов на сайте Spring?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Можно использовать RequestParam - параметры адресной строки. Они могут быть разных типов. Пример из моего проекта:
    @GetMapping("/list")
      List<AuditAssetItem> getChangesByCriteria(
        @RequestParam int assetid,
        @RequestParam String from,
        @RequestParam String to,
        @RequestParam boolean item,
        @RequestParam boolean rights,
        @RequestParam boolean extended
      ) {
    
        return service.getAuditListByCriteria(assetid, from, to, item, rights, extended);
      }

    В строке браузера адрес будет выглядеть примерно так:
    http : //mysite.ru/list?assetid=123&from=2020-12-01&to=2020-12-10&item=true&rights=true&extended=false

    Spring разложит эти параметры по переменным в соответствии с их типами, далее ты засылаешь их в сервис и там по своей логике корректируешь запрос или пишешь несколько запросов.
    Ответ написан
  • Spring boot: как логировать в файл отдельно от консоли?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Тэкс! На случай если кому интересно (и себе для памяти).
    В папку resources надо добавить файл logback-spring.xml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
      <!--https://docs.spring.io/spring-boot/docs/2.7.6/reference/html/features.html#features.logging-->
      <!--https://docs.spring.io/spring-boot/docs/2.7.6/reference/html/howto.html#howto.logging-->
      <!--https://www.baeldung.com/spring-boot-logging-->
      <!--https://github.com/spring-projects/spring-boot/blob/v2.7.6/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/-->
    
      <include resource="org/springframework/boot/logging/logback/defaults.xml" />
      <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    
      <property name="LOG" value="log-folder"/>
    
      <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
          <Pattern>%d{yyyy-MM-dd HH:mm:ss} %p %logger : %m%n</Pattern>
          <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
    
        <file>${LOG}/my-log-file.log</file>
    
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
          <fileNamePattern>${LOG}/archived/my-log-file-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
          <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
          <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
          <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
          <maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory>
        </rollingPolicy>
      </appender>
    
      <root level="info">
        <appender-ref ref="CONSOLE"/>
      </root>
    
      <logger name="my-logger-name" level="info">
        <appender-ref ref="ROLLING_FILE"/>
      </logger>
    
    </configuration>


    Там закомментированы ссылки на статьи, которыми пользовался для решения.

    Логгер в классе определяется так:

    static final Logger log = LoggerFactory.getLogger("my-logger-name");
    Ответ написан
    Комментировать
  • Как хранить статическую информацию в spring-приложении?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Ну, для хранения данных есть два "контейнера": файл или база данных.
    Для файла можно выбрать формат JSON: и человекочитаемо, и легко парсить, и нет проблем с русским языком (в отл от .properties).
    Ну а база - любая база. Если концепция вопросов-ответов укладывается в "ключ-значение", то можно брать что-то NO-SQL (Redis и пр.).
    Но мне кажется что JSON - самое простое, и главное - не нужен программист для правки данных.
    Ответ написан
    Комментировать
  • Как правильно отправлять файлы в RESTfull приложении?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Можно разделить Java-объект на два и на фронте получать двумя разными запросами:
    - описание: объект -> DTO-объект (тот же объект, но без картинки) -> JSON;
    - картинка: массив -> поток -> MIME-тип картинка.
    Это имеет смысл если картинка довольно большая, если только миниатюра, то можно передавать всё вместе.
    Ответ написан
    Комментировать
  • Зачем нужен WebFlux?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    По-моему, хороший ответ даёт вот этот мущщина :)
    Если кратко, использование асинхронного подхода даёт более отзывчивое приложение. При этом оно может и не быть быстрее, но т.к. пользователь начинает быстрее получать первые данные, ему кажется что оно быстрее.
    Ответ написан
  • Как спроектировать отправку данных по консюмерам?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Сделать статус PARTIALLY_SENT и поле с получателями. Можно попробовать писать в базу прямо List или Set, через .toString() преобразовывать в строку вида {"user1", "user2", ... }. Поле каждого получения обновляешь поле, удаляя получателя. Как поле становится пустым - значит всем отправлено... и даже статус не нужен :)
    Можно писать Map (получатель, число_попыток). Map тоже хорошо преобразуется методом .toString(), правда в обратную сторону придётся написать парсер, впрочем, он будет очень простой.
    Ответ написан
    Комментировать
  • Как устранить ошибку CORS?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Я у себя добавил такую конфигурацию:
    /*
    https://www.baeldung.com/spring-webflux-cors
    https://www.baeldung.com/spring-cors
     */
    
    package com.broadview.bvreportsgenerator.configuration;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.reactive.config.CorsRegistry;
    import org.springframework.web.reactive.config.EnableWebFlux;
    import org.springframework.web.reactive.config.WebFluxConfigurer;
    
    @Configuration
    @EnableWebFlux
    public class CorsGlobalConfiguration implements WebFluxConfigurer {
    
      @Override
      public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
      }
    }


    Это вариант для WebFlux. Если у тебя "обычный" web, будут немного другие вызовы, см. статьи в коменте.
    Ответ написан
    6 комментариев
  • Spring Boot Data JPA, как добавить логику при чтении объекта из базы?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    В общем, решил добавлением дополнительного сервисного класса, который берёт объекты из репозитория и преобразует как надо, а основная программа уже получает готовые объекты из него. Что есть правильно ибо преобразование - это уже бизнес-логика и не надо её мешать с DAO. Самое смищное что это и есть Спринг-Путь и это описано во всех учебниках. А я чёт затупил :) Ну, ничего: понимание ведёт к запоминанию, в следующий раз буду умнее :)
    Ответ написан
    Комментировать
  • Spring Boot Security, как настроить русский логин?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Решил проблему переводом конфига с application.properties на application.yml. Так кодировка человечья :)
    Ответ написан
    Комментировать
  • Spring и Firebird: как исправить предупреждения SQLState: null и not support non-zero timeouts?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Тэкс... С первым вопросом разобрался, оставлю здесь, вдруг кому пригодится. Решил понижением версии JDBC-драйвера до 2.2.15 (прописыванием соответствующей строки в pom.xml). Я так понял - старому серверу СУБД - старый драйвер :) Кстати, jar для java-1.8 нормально (по крайней мере пока) работает под java-17.

    Второй вопрос пока без ответа, там трюк с подсовыванием старого драйвера не сработал.....
    Ответ написан
    Комментировать