Задать вопрос
Ответы пользователя по тегу Spring
  • Как сделать, чтобы при существующем объекте в модальном окне Bootstrap отображались его поля(Spring)?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    При клике на кнопке Show вам необходимо отправить ajax запрос на сервер и получить информацию об объекте в json формате.
    Затем полученный объект распарсить и вставить в соответствующие поля.
    Чтобы отправить ajax запрос смотрите на:
    https://api.jquery.com/jquery.get/
    https://api.jquery.com/jquery.ajax/
    Дальше уже дело техники...
    Чтобы вернуть ответ в json используйте либо @RestController или же @ResponseBody, если используете @Controller

    Судя по вашему коду, вы все правильно сделали. А в чем именно ошибка или проблема?
    Ответ написан
  • Как избавиться от No 'Access-Control-Allow-Origin' header is present on the requested resource?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Так там написано, что нет заголовка "Access-Control-Allow-Origin".
    Полезное чтиво - https://www.baeldung.com/spring-cors
    https://spring.io/guides/gs/rest-service-cors/
    Ответ написан
    Комментировать
  • Как в WebClinet передать ArrayList?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Вот статья:
    https://www.baeldung.com/spring-webclient-json-list
    Обратите внимание на: ParameterizedTypeReference
    Ответ написан
    Комментировать
  • Как сделать rest контроллер для отправки сообщения от телеграмм бота?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Кстати, есть готовые либы, который позволяют удобно работать с телеграм ботом через Spring
    https://github.com/kshashov/spring-boot-starter-te...
    https://github.com/xabgesagtx/telegram-spring-boot...
    Ответ написан
  • В чем предназночения сервисов?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Соль использования в том, что в сервисы добавляют бизнес-логику. Например, получить данные из репозитория и что-то с ними сделать. Или же наоборот после получения данных из контроллеров, обработать их на уровне сервисов, а затем уже сохранить и т.д.
    Возможно, что необходимо замаппит объект в DTO или же наоборот.
    В общем. нужная вещь))
    Ответ написан
    1 комментарий
  • Есть ли какие-нибудь готовые решения/ библиотеки для чата?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    В качестве "движка" можете использовать RabbitMQ, Spring Websockets, ActiveMQ, Kafka.
    Ну и остается взять какой-нибудь красивый фронт и написать необходимый функционал
    Ответ написан
    2 комментария
  • Полностью не работают файлы формата HTML во View MVC проекта, как исправить?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый вечер.
    Проблема не в спринге, а настройках вашего IDE.
    Попробуйте - https://intellij-support.jetbrains.com/hc/en-us/co...
    Ответ написан
    Комментировать
  • Почему возникает org.springframework.beans.factory.UnsatisfiedDependencyException, при попытке подключения к PostgreSQL?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Уберите:
    <!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
        <dependency>
          <groupId>org.hibernate.orm</groupId>
          <artifactId>hibernate-core</artifactId>
          <version>6.0.0.Final</version>
        </dependency>
     <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
          <version>5.6.8.Final</version>
        </dependency>


    Также вы можете удалить version отсюда:
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
          <version>2.6.6</version>
        </dependency>


    Попробуйте перезапустить приложение. Вот. похожая проблема: https://stackoverflow.com/questions/42182426/sprin...
    Ответ написан
    Комментировать
  • Как спарсить json?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Есть онлайн-сервис, который помогает создать pojo на основе json
    Вот, что он выдал
    -----------------------------------com.example.Example.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "0",
    "1",
    "2"
    })
    @Generated("jsonschema2pojo")
    public class Example {
    
    @JsonProperty("0")
    public com.example._0 _0;
    @JsonProperty("1")
    public com.example._1 _1;
    @JsonProperty("2")
    public com.example._2 _2;
    
    }
    -----------------------------------com.example._0.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "created",
    "suip",
    "result",
    "operationNumber"
    })
    @Generated("jsonschema2pojo")
    public class _0 {
    
    @JsonProperty("created")
    public String created;
    @JsonProperty("suip")
    public String suip;
    @JsonProperty("result")
    public String result;
    @JsonProperty("operationNumber")
    public String operationNumber;
    
    }
    -----------------------------------com.example._1.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "created",
    "suip",
    "result",
    "operationNumber"
    })
    @Generated("jsonschema2pojo")
    public class _1 {
    
    @JsonProperty("created")
    public String created;
    @JsonProperty("suip")
    public String suip;
    @JsonProperty("result")
    public String result;
    @JsonProperty("operationNumber")
    public String operationNumber;
    
    }
    -----------------------------------com.example._2.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "created",
    "suip",
    "result",
    "operationNumber"
    })
    @Generated("jsonschema2pojo")
    public class _2 {
    
    @JsonProperty("created")
    public String created;
    @JsonProperty("suip")
    public String suip;
    @JsonProperty("result")
    public String result;
    @JsonProperty("operationNumber")
    public String operationNumber;
    
    }

    Сам сервис - https://www.jsonschema2pojo.org/
    Ответ написан
    1 комментарий
  • Можно ли подключить Spring к proteus(или аналогам)?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Ответ написан
    Комментировать
  • Как сделать рефакторинг данный код?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Поделюсь своими мыслями. А вы уже сами решайте стоит ли вносить правки в ваш код.
    1) Судя по этому сниппету:
    public void updateUserByInn(List<Users> usersList) {
            for (Users dto : usersList) {

    Метод принимает Dto.
    Ну тут во-первых, класс должен быть в ед. числе Users -> User
    Во-вторых, если это Dto, то это должно быть как-то отображено в названии. Например, UserDto, UserUpdateRequest и т.д.
    А раз это DTO, то маппинг можно вынести в отдельный метод или даже класс. Можно воспользоваться интерфейсом Converter <UserDto, User>, можно подключить либы (ModelMapper, MapStruct).
    Если решите использовать ModelMapper, то обратиться внимание на этот вопрос, дабы исключить null параметры:
    https://stackoverflow.com/questions/45451025/how-t...

    2) Вместо того, чтобы выбрасывать NPЕ можно использовать Optional класс и выбросить кастомное исключение:
    Users user = usersRepository.findByInnAndExternalPartnerId(dto.getInn(), dto.getExternalPartnerId()).orElseThrow(UserNotFoundException::new);

    Для этого из репозитория ваши методы должны возвращать Optional<User>

    3) Сам метод должен быть назван корректно.
    updateUserByInn обновить юзера по ИНН. А в методе вы обновляете пользователей, а не одного юзера еще и притом обновляете не только по Inn, а по ExternalPartnerId тоже. Значит, метод назван некорректно

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

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Если брать запрос: localhost:8080/ то он должен проверить была ли сделана авторизация, если нет, то делает redirect, если было сделано, то он показывает разметку, в котором уже находятся данные объекта пользователя.


    Вот, например небольшой сниппет:
    @GetMapping("/admin")
        public String dashboard() {
            // Проверка авторизации пользователя
            boolean isAuthorised = SecurityContextHolder.getContext().getAuthentication() != null &&
                    SecurityContextHolder.getContext().getAuthentication().isAuthenticated() &&
                    !(SecurityContextHolder.getContext().getAuthentication() instanceof AnonymousAuthenticationToken);
            if (isAuthorised) {
                return "redirect:/admin/dashboard";
            }
            return REDIRECT_ADMIN_LOGIN;
        }


    Так же было не понятно что после кнопки авторизации, передача объекта другому запросу с помощью redirect. По коду выглядит все так

    В это случае вместо addAttribute() нужно использовать addFlashAttribute()
    Подробности тут - https://stackoverflow.com/questions/14470111/sprin...
    Ответ написан
  • Как в Spring boot Java сформировать подпись?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Так вроде там написано, что нужно сделать. Даже показан код на js.
    Вы хотите интегрировать некий сторонний сервис, куда будете отправлять запрос или как? Если вы хотите у себя формировать некую подпись, то скорее всего нужен контроллер с указанным в задании урлом (нужно больше информации).
    А так если вкратце:
    1) Есть URL, куда нужно отправлять запрос. Для отправки запроса из Spring используйте RestTemplate. Если нужен реактивный стек, то WebClient.
    2) Есть JSON, который нужно отправить в Body. Структура json указана во втором пункте.
    3) Далее есть соль (salt). Для генерации используйте UUID.randomUUID().toString();
    4) Также вам необходимо secret key полученный от Namba One перевести в hmac.
    Вот, пример:
    https://www.baeldung.com/java-hmac
    Ответ написан
    Комментировать
  • Как парсить данные с localhost:8080, используя Jsoup?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Я посмотрел на исходный код проекта и все стало на свои места.
    Во-первых, этот проект использует Vaadin. К сожалению, мне не доводилось использовать его, но я могу сказать следующее:
    Контент страницы формируется динамически на клиенте. JSoup не умеет работать с динамически формируемым контентом и потому, на момент парсинга документа там лишь:
    <div id="outlet"></div>
    Соответственно, чтобы спарсить динамический контент вам нужно:
    1) либо изучить внутренний АПИ и спарсить json, который возвращается извне. Зайдите во вкладку Network (Сеть) браузера и отфильтруйте XHR запросы и гляньте, на какой эндпоинт выполняется запрос и что возвращается в ответ.
    2) либо спарсить сайт при помощи Selenium. (запустить браузер, дождаться загрузки страницы, получить документ, получить List<WebElement>)
    Ответ написан
    1 комментарий
  • Как зашифровать / обезопасить property файл?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вы можете воспользоваться Java Cryptography Extension
    https://www.oracle.com/java/technologies/javase-jc...
    Ответ написан
    Комментировать
  • Как сформировать структуру данных и вернуть на клиент?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Скажите пожалуйста, правильно ли я понимаю, что у вас есть таблица с данными, а также сами сущности (entity) и вы хотите вернуть результат полученный из БД на клиент?
    Т.е. меня интересует следующее: db first or code first?
    Если у вас code first, то значит сущности у вас имеются и вам необходимо создать доп. классы (DTO). Далее полученные данные из БД замаппить в DTO.
    Для маппинга (после того, как будут созданы DTO) можно использовать доп. либы: ModelMapper, MapStruct или же интерфейс Converter<S,T>
    Если хотите создать dto на основе имеющегос у вас json файла, то можно воспользоваться онлайн-сервисом или представляемой ими либой.
    Сервис - https://www.jsonschema2pojo.org/
    Кстати, вы уверены, что у вас в вопросе указаны данные в json?
    Вот, json:
    {
        "id": 1,
        "numberOperation": "010",
        "nameOperation": "Токарная",
        "workshop": 6465,
        "area": 7,
        "OO": true,
        "OTK": false,
        "PZ": true,
        "KPS": true,
        "transition": [
            {
                "id": 1,
                "nameTransition": "Закрепить деталь",
                "executor": [
                {
                    "id": 1,
                    "nameExecutor": "4784",
                    "tsht": "4",
                    "tpz": "9",
                    "test": "7",
                    "tshtCalculated": "",
                    "tpzCalculated": "",
                    "testCalculated": "",
                    "kvr": "973"
                }, ]
            },
    
        ]
    }

    И вот dto построенные на основе вышеуказанного json (обратите внимание, что код скорее всего необходимо подправить под ваши нужды)
    DTOs
    -----------------------------------com.example.Example.java-----------------------------------
    
    package com.example;
    
    import java.util.List;
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "id",
    "numberOperation",
    "nameOperation",
    "workshop",
    "area",
    "OO",
    "OTK",
    "PZ",
    "KPS",
    "transition"
    })
    @Generated("jsonschema2pojo")
    public class Example {
    
    @JsonProperty("id")
    public Long id;
    @JsonProperty("numberOperation")
    public String numberOperation;
    @JsonProperty("nameOperation")
    public String nameOperation;
    @JsonProperty("workshop")
    public Long workshop;
    @JsonProperty("area")
    public Long area;
    @JsonProperty("OO")
    public Boolean oo;
    @JsonProperty("OTK")
    public Boolean otk;
    @JsonProperty("PZ")
    public Boolean pz;
    @JsonProperty("KPS")
    public Boolean kps;
    @JsonProperty("transition")
    public List<Transition> transition = null;
    
    }
    -----------------------------------com.example.Executor.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "id",
    "nameExecutor",
    "tsht",
    "tpz",
    "test",
    "tshtCalculated",
    "tpzCalculated",
    "testCalculated",
    "kvr"
    })
    @Generated("jsonschema2pojo")
    public class Executor {
    
    @JsonProperty("id")
    public Long id;
    @JsonProperty("nameExecutor")
    public String nameExecutor;
    @JsonProperty("tsht")
    public Long tsht;
    @JsonProperty("tpz")
    public Long tpz;
    @JsonProperty("test")
    public Long test;
    @JsonProperty("tshtCalculated")
    public String tshtCalculated;
    @JsonProperty("tpzCalculated")
    public String tpzCalculated;
    @JsonProperty("testCalculated")
    public String testCalculated;
    @JsonProperty("kvr")
    public Long kvr;
    
    }
    -----------------------------------com.example.Transition.java-----------------------------------
    
    package com.example;
    
    import java.util.List;
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "id",
    "nameTransition",
    "executor"
    })
    @Generated("jsonschema2pojo")
    public class Transition {
    
    @JsonProperty("id")
    public Long id;
    @JsonProperty("nameTransition")
    public String nameTransition;
    @JsonProperty("executor")
    public List<Executor> executor = null;
    
    }
    Ответ написан
    Комментировать
  • Как дозаполнить корректно поля для Entity при конвертации из DTO?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Думаю, что вопрос сформулирован некорректно или возможно, я его недопонял.

    Итак, насколько я вас понял, то вы хотите обновить существующую запись на основе данных, которые прибежали из контроллера в виде DTO.

    Во-первых, в данном случае стоит использовать PutMapping (full updates) или PatchMapping (partial updates)
    Читаем подробно тут:
    https://www.baeldung.com/http-put-patch-difference...

    Во-вторых, после того, как вы получили DTO вам необходимо его замаппить в Entity и обновить в БД. Однако, могут быть поля, которые не были заполнены в DTO и вы не хотите, чтобы они были применены, как null, так?

    Далее конвертирую в entity, но откуда мне взять значения тех полей, которых не было в запросе?

    Вам не нужно дозаполнять поля сконвертированного entity. Вам необходимо:
    1) найти этот entity по идентификатору.
    2) Если не хотите, чтобы null поля были применены к сущности, то при маппинге (см. ниже) сделать null check и если поле DTO null, то не сеттить его к сущности.
    3) сохранить сущность.

    Что касается маппинга:
    1) Вы можете использовать интерфейс Converter<S, T>. И для каждого из полей сделать проверку типа (псевдокод):
    if (fieldValue != null) { entity.setField(fieldValue); }

    2) Если вы используете какую-либо библиотеку для маппинга (modelMapper, MapStruct и др.), то используйте возможности либы. Например, для modelMapper:
    modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());

    https://stackoverflow.com/questions/45451025/how-t...

    Также прокомментирую ваши комментарии из другого ответа:
    вот мне интересно, как решается этот вопрос. Разве это нормально, что на каждый пришедший запрос к сервису приходится ходить к базе данных? И это без учета логики!

    Можно настроить кеширование и тогда, обращения к БД не будет.


    Это базовая ситуация, с которой сталкивается каждый. Допустим у меня entity Person с атрибутом даты рождения, которую я не хочу отображать в PersonDto. Когда пользователь пришлем мне PersonDto по API для, допустим, операции обновления, то как мне при конвертации в entity вернуть эту дату рождения, чтобы я мог сохранить новую сущность?

    Обратите внимание на то, что может быть несколько DTO.
    Например,
    PersonCreationRequest - dto, которое заполняется из фронта при создании юзера
    PersonCreationResponse - dto, которое заполняется из бекенда после создания юзера
    PersonUpdatingRequest - dto, которое заполняется из фронта при обновлении юзера
    PersonUpdatingResponse - dto, которое заполняется из бекенда после обновления юзера
    PersonDto - общее dto, которое заполняется из бекенда для других нужд.
    Могут быть и другие DTO...
    Соответственно, ответ на ваш вопрос - используйте разные DTO.

    Не знаю насколько точно смог ответить на ваш вопрос.
    Ответ написан
    1 комментарий
  • Есть ли что-то типа Spring Boot remote shell для удаленного выполнения комманд?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Ну судя по всему нет официальной замены, но есть сторонняя либа:
    https://github.com/anand1st/sshd-shell-spring-boot

    Источник: https://stackoverflow.com/questions/46725760/succe...
    Ответ написан
    Комментировать
  • Как спроектировать API, чтобы избежать ошибку 504 Gate away?

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

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

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

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