Задать вопрос
Ответы пользователя по тегу Spring
  • Как спроектировать API, чтобы избежать ошибку 504 Gate away?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Проблема в том что, Из-за больших обращений в сторонний API, программа работает слишком долго(5-7 минут) при запуске на прод получаю 504 Gate away.

    Посмотрите в сторону WebFlux. В частности, можно использовать Flux<>

    При каждом итерации цикла используя WebClient стучится с параметром в сторонний API с БД и получает некие данные обратно.

    Есть ли возможность доработать сторонний API? Т.е. принадлежит ли он вам? Если да, то можете добавить доп. контроллер, который позволит массово обрабатывать запросы, тем самым уменьшив кол-во запросов с n до 1.
    Ответ написан
    Комментировать
  • Spring как отправить JSON строку?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    А вы js код откуда-то скопировали или как?
    1) Сама идея возврата json из контроллера в таком виде - не очень. Вам необходимо вернуть dto. А jackson уже сам сериализует в json
    @GetMapping("/json")
      public String getJSON2() {
        return "{ \"id\": 10, \"name\": \"Clementina DuBuque\", \"username\": \"Moriah.Stanton\","
            + " \"email\": \"Rey.Padberg@karina.biz\", "
            + "\"address\": { \"street\": \"Kattie Turnpike\", "
            + "\"suite\": \"Suite 198\", \"city\": \"Lebsackbury\", "
            + "\"zipcode\": \"31428-2261\", \"geo\": { \"lat\": "
            + "\"-38.2386\", \"lng\": \"57.2232\" } }";
      }


    2) Как отметил коллега Dmitry Roo у вас то, что происходит в браузере и то что происходит в js коде - это разные вещи.
    Вот, смотрите:
    В коде ниже вы совершаете GET запрос на /api/json.
    Во-первых, непонятно, что это: data: { command: "GetDriverInfo" },, а главное зачем и как она должна быть обработана контроллером.
    Во-вторых, непонятно какой параметр вы хотите получить:
    console.log(response.driverVer);, если такого параметра driveVer у вас нет в json.
    Ответ написан
    Комментировать
  • Как из вложенных объектов в классе сделать одну таблицу?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ответ - никак.
    Как вы сами сказали, это объекты. А значит, их значения будут хранится в других таблицах. А этот объект при помощи foreign key будет ссылаться на вложенный объект.

    Есть правда, следующий вариант (если он вам подойдет):
    Если объект может быть встроенным, то вы можете вместо сущности использовать аннотации @Embeddable & @Embedded
    https://www.baeldung.com/jpa-embedded-embeddable
    Т.е. по факту колонки встраиваемого объекта будут добавлены к основной сущности

    P.S. есть еще один вариант реализации вашей задумки. Возможно, что не самый лучший.
    В общем, если вы используете БД postgres, то объект можно хранить в формате jsonb.
    Из коробки решения нет, но можно подключить доп. либу.
    Вот, похожий вопрос:
    https://stackoverflow.com/questions/51276703/how-t...

    Зависимость:
    <dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-52</artifactId>
        <version>2.2.2</version>
    </dependency>


    @Type(type = "jsonb")
        @Column(columnDefinition = "jsonb")
        private List<Child> children;


    На мой взгляд, лучше не заморачиваться так. Имхо, правильнее создавать отдельные таблицы.
    Ответ написан
    1 комментарий
  • Как создать запрос диапазона даты, используя query?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Вы можете не писать Query, а использовать возможности самого JPA
    Полезная статья по теме: https://www.baeldung.com/spring-data-jpa-query-by-date
    По идее, должно получиться примерно так:
    findAllByDateEventBetween(@Param("end_date") LocalDate date, @Param("end_time") LocalTime time);

    Обратите внимание на between
    Ответ написан
  • Как правильно логировать базу данных?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Если честно, то не совсем понятно чего вы хотите.
    В БД есть логирование. Вот, например PostgreSQL

    Если речь идет о логах hibernate & jpa, то вот, полезная статья:
    https://www.baeldung.com/sql-logging-spring-boot
    Можно установить уровень логирования, а затем например, вывести логи в файл

    Если речь про Spring & Hibernate (про аудирование), например, когда какая сущность была добавлена или обновлена, то есть например, EntityListeners.

    Вот, простой пример:
    @SpringBootApplication
    @EnableJpaAuditing
    public class Application {
      public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
      }
    }


    сущность User -
    @Entity
    @EntityListeners(AuditingEntityListener.class)
    @Table(name = "users")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        private Long id;
    
        @CreatedDate
        @Column(updatable = false)
        private LocalDateTime created;
    
        @LastModifiedDate
        private LocalDateTime lastModified;
    
    }
    Ответ написан
    2 комментария
  • Может ли Service иметь репозитории других классов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Могу ли я прямо обратиться к репозиторию Entity A из Service B?

    Да, можно. Другой вопрос - хорошо ли.

    Или мне надо это делать вот так Service B -> Service A -> Repository A?

    Я предпочитаю этот способ.
    Причина следующая:
    Вот, представьте, что на сервисном уровне вы получаете Optional<T> из репозитория и в случае, если объект не найден, то на сервисном уровне выбрасываете исключение orElseThrow(). Ну а далее ExceptionHandler ловит исключение и отдает соответствующий код ошибки и сообщение на фронт.
    Если вы решите из сервиса А обратиться в репозиторий Б, то по факту вам нужно заново получить объект и выбросить исключение в случае, если он не найден, а это уже дублирование кода...
    Псевдокод:
    ServiceA {
    @Autowired
    RepoB repoB;
    @Autowired
    ServiceB serviceB;
    
    // 1 вариант
    List<Job> doSomeJob1(String email){
    User user =  repoB.findUserByEmail(email).orElseThrow(UserNotFoundException::new);
    return user.getJobs();
    }
    
    // 2 вариант
    List<Job> doSomeJob2(String email) {
    User user = serviceB.getUserByEmail(email);
    return user.getJobs();
    }
    
    RepoB {
    Optional<User> findUserByEmail(String email);
    }
    
    ServiceB {
    @Autowired
    RepoB repoB;
    
    User getUserByEmail(String email){
    return repoB.findUserByEmail(email).orElseThrow(UserNotFoundException::new);
    }
    
    }


    Во втором варианте нам не пришлось писать логику и выбрасывать исключение.
    А так многое зависит от проекта, от того, как принято в команде работать и т.д.

    Проблема в том, что у меня все сервисы DTOшки, а для работы Service B нужны нормальные объекты, что делать в таком случае? Неужели создавать отдельные точно такие же методы просто без конверта в дто?

    Я это обычно, делаю по другому. Я возвращаю объекты из сервисов. А если мне нужно DTO, то есть отдельный сервис MapperService, который принимимает дженерик и возвращает соответствующие DTO.
    Ответ написан
    4 комментария
  • Нормально ли кидать эксепшены в Spring boot web app?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый вечер.
    Да, нормально.
    Само исключение (лог) не нужно отдавать на фронт.
    На фронт отдайте код http ошибки (4хх) и какое-нибудь кастомное сообщение: "Недостаточно средств".
    Посмотрите в сторону ExceptionHandler.
    Ответ написан
    Комментировать
  • Какие отношения должны быть между этими двумя Entity?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Нечто похожее уже обсуждалось в данном вопросе:
    https://qna.habr.com/q/1111518

    Допустим, что у вас есть сущность Product, а также сущность Order.
    В одном заказе может быть некоторое кол-во одного товара, а значит, вам где-то нужно хранить еще и кол-во заказанного товара.
    Для этого подойдет аггрегация, как вариант.
    Т.е. нужно завести доп. таблицу (например, OrderData), в которой foreign_keys будут являться и product_id и order_id, а также будет. доп. колонка quantity.
    +----------+------------+----------+
    | order_id | product_id | quantity |
    +----------+------------+----------+
    |        1 |          2 |       10 |
    |        2 |          3 |       11 |
    +----------+------------+----------+


    Таким образом, у вас должно получится что-то типа такого (псевдокод):
    Product {
    long productId;
    }
    Order {
    long orderId;
    }
    OrderData {
    Order order;
    Product product;
    int quantity;
    }


    Другой вариант:
    это как указано в вопросе по ссылке выше. Использовать мапу.
    Привожу ссылку на полезный ресурс:
    https://www.baeldung.com/hibernate-persisting-maps
    Что в данном случае должно получиться (псевдокод):
    Product {
    long productId;
    }
    
    Order {
    
    @MapKeyColumn(name = "product_id")
    @Column(name = "quantity")
    Map<Long, Integer>
    }


    В данном случае, мы указываем на MapKeyColumn. Т.е. уник. ключом будет являться идентификатор продукта. А значением будет его кол-во (название указано в Column).

    Наверняка, если подумать еще, то можно найти еще варианты.
    Ответ написан
    Комментировать
  • Как правильно аннотировать @OneToMany, когда используем map в данном случае?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вот, есть наглядная статья по вашему вопросу:
    https://www.baeldung.com/hibernate-persisting-maps
    Ответ написан
    4 комментария
  • Не могу получить доступ к MSQL?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Вы хотите подключиться к MySQL или к MsSQL?

    Тут в вашем конфиге ну все в одну кучу намешано.
    Во-первых, необходимо прописать строки, которые указал Михаил
    Во-вторых, драйвер не от MySQL и даже не от MsSQL. А от db2.
    В-третьих, url тоже прописан для db2
    hibernate.connection.driver_class = com.ibm.db2.jcc.DB2Driver
    hibernate.connection.url = jdbc:db2://127.0.0.1:3306/test1250
    hibernate.connection.username = testuser
    hibernate.connection.password = Test12345678
    hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
    driverClassName: com.mysql.cj.jdbc.Driver


    Предположительно должно быть:
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test1250
    spring.datasource.username=testuser
    spring.datasource.password=Test12345678
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

    Возможно, что название БД, логин и пароль отличаются.
    Ответ написан
    2 комментария
  • Как поставить телеграм бота java на windows server?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну по-первых, сервер на Windows - плохой выбор. Рекомендую использовать Linux.
    Во-вторых, хоть сервер на Windows, хоть на Linux, а работать придется через терминал (консоль). Необходимо подключиться по ssh и установить jdk и т.д. В данном случае GUI (графическая оболочка) вам не нужна.
    В-третьих, если нужен относительно дешевый vps на linux, то hetzner неплохой.

    Теперь, по существу вопроса:
    1) вам нужна программа для работы с ssh.
    Например, xShell - https://www.netsarang.com/ru/xshell/
    Скачать / установить.
    2) Подключиться к серверу по ssh
    Ввести хост, логин, пароль, порт (возможно, пуб. ключ и т.д.)
    3) Установите Java
    https://www.java.com/en/download/help/silent_insta...
    https://stackoverflow.com/questions/51112065/how-t...
    4) Перекиньте ваш проект на сервер и запустите.
    Ответ написан
    Комментировать
  • Как отправить запрос в виде url и в ответ получить xml?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    URL на который вы обращаетесь, я так понимаю, что это сторонний сервис? И вы хотите по API обратиться из Spring'a на этот сервис и полученный ответ в xml прочитать и что-то с ним сделать?
    Прочитайте про RestTemplate
    https://www.baeldung.com/rest-template
    Это для отправки запроса на сторонний сервис.

    Вот, пример того, как получить xml и распарсить его в pojo -
    https://stackoverflow.com/questions/36124081/sprin...
    Ответ написан
    Комментировать
  • Пример кода: таблица с фильтрацией с использованием Thymeleaf и Spring ( можно Boot ), как найти?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну тут стоит обратить внимание на 2 варианта реализации:
    1) фильтрация / сортировка на стороне клиента средствами js. Т.е. с сервера отдаются данные, а затем уже эти данные сортируются на стороне клиента
    2) фильтрация / сортировка на стороне сервера. А данные уже отдаются в отсортированном виде

    Сортировку и фильтрация на клиентской стороне можно достичь средствами js.
    Вот, готовый продукт:
    Data Tables -
    сортировка - https://datatables.net/examples/basic_init/table_s...
    фильтрация - https://datatables.net/extensions/fixedheader/exam...
    Если нужна серверная фильтрация и сортировка в DataTables, то:
    https://datatables.net/examples/data_sources/serve...

    А вот, готовая либа для Spring, чтобы работать с DataTables. Фильтрация также поддерживается:
    https://github.com/darrachequesne/spring-data-jpa-...

    Вот, кастомный пример сортировка средствами js
    простое нажатие на хедер таблицы

    https://bootsnipp.com/snippets/1erEV

    Теперь, что касается фильтрации и сортировки на серверной стороне средстваами самого Spring:
    https://www.bezkoder.com/spring-boot-pagination-so...
    https://www.baeldung.com/spring-data-jpa-paginatio...

    P.S. у разработчика bezkoder (ссылка выше), также есть страница на гитхаб, где предложены исходники проектов
    Ответ написан
    Комментировать
  • Thymeleaf, th:text не работает, если находится внутри другого th:text, как обойти?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Если память не изменяет, то вам нужен th:inline
    Примерно так:
    <h4 th:inline="text">[[${product.name}]]<span th:text="${product.getPrice()}">45</span></h4>

    Вот, прочитайте этот вопрос:
    https://stackoverflow.com/questions/25071985/thyme...
    Ответ написан
    Комментировать
  • Почему Bad Request, status=400 при загрузке файлов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Ваш инпут называется images
    <input type="file" name="images" multiple class="form-control" accept=".jpg, .jpeg" >


    В контроллере вы ожидаете files
    @RequestParam("files") MultipartFile[] images
    Ответ написан
    Комментировать
  • Стоит ли использовать разные DTO для Response и Creation объекта?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Зависит от проекта, но на мой взгляд хорошей практикой является создание разных DTO.
    Например,
    UserCreationDto
    UserUpdateDto
    Ответ написан
    Комментировать
  • Spring Boot, таблица с сортировкой, фильтрацией, пагинацией, как это реализовать?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Я только учусь и просьба быть терпимым к такому тупому вопросу:(

    Нормальный вопрос)
    Нашел вариант только с DataTables CDN, но там не происходит обращение к БД

    Ну во-первых, именно Datatables я вам и посоветую.
    А во-вторых, если хорошо глянуть в документацию, то найдете
    https://datatables.net/manual/server-side
    https://datatables.net/examples/data_sources/serve...
    В примере во второй ссылке показана пагинация с обращением на сервер
    Ну и конечно же готовая либа для Spring Boot для работы с DataTables
    https://github.com/darrachequesne/spring-data-jpa-...
    Ответ написан
    1 комментарий
  • Как делать фронтенд с минимумом усилий если я хочу углубиться в бэкенд?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Изучаю Spring, дошел до момента когда можно начинать добавлять фронтенд, но я не хочу писать html и css, какое сейчас современное решение есть для этого?

    Ну если вы работаете в команде, то не факт, что вам нужно напсать фронтэнд. Для этого есть фронтэндеры.
    Если вы пишете свой проект, то тут вам в любом случае нужно знать основы веба - html, css, js.
    Можно конечно же реализовать фронт при помощи шаблонизатора thymeleaf (или других - mustache, freemarker). Ну а если захотите избавиться от js, то можете изучить фреймворк Vaadin.
    Или же можно поднять отдельное приложение на js или ts. На мой взгляд самый простой фреймворк - VueJS. React, Angular относительно сложные. А в Spring соответственно разработать REST приложение.
    Разработка фронта не зная основ веба невозможна.
    Ответ написан
    Комментировать
  • Spring Boot Actuator: как включить кириллицу?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    В applilication.properties пишем:

    Добрый день.
    Кодировка для Properties - ISO-8859-1
    Default is none, using the java.util.Properties default encoding: ISO-8859-1.

    Соответственно, вам нужно либо написать свой конвертер кодировки, либо сконвертровать онлайн текст на русском геа-8 в ISO-8859-1.
    Вот, похожий по тематике вопрос:
    https://stackoverflow.com/questions/48880095/how-c...
    Ответ написан
    1 комментарий
  • Как создать контейнер для postgresq и spring boot приложения? И чтобы они взаимодействовали между собой?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Во-первых, вам необходимо при подключении jdbc указать название сервиса (postgres), вместо localhost
    Во-вторых,
    Вам нужно в yml добавить
    networks:
      myApp:
        name: myApp
        driver: bridge


    А также каждый сервис добавить в network
    ports:
          - "5432:5432"
    networks:
          - myApp
    Ответ написан