Ответы пользователя по тегу Spring
  • Пытаюсь подключиться к postgresql 16 через docker-compose, использую spring-boot 3.2.4, что не так?

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

    java.net.UnknownHostException: db


    Попробуйте добавить оба контейнера в одну сеть.

    version: "3"
    
    services:
    
      app:
        build:
          context: .
          dockerfile: app.Dockerfile
        environment:
          - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/javacode
          - SPRING_DATASOURCE_USERNAME=postgres
          - SPRING_DATASOURCE_PASSWORD=postgres
        ports:
          - "8080:8080"
        networks:
          app:
    #    command: ["./wait-for-it.sh", "db:5432", "java", "-jar", "/app/app.war"]
    
      db:
        build:
          context: .
          dockerfile: postgreSQL.Dockerfile
        container_name: db
        environment:
          POSTGRES_DB: javacode
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
        ports:
          - "5432:5432"
        volumes:
          - ./db/initDB.sql:/docker-entrypoint-initdb.d/initDB.sql
        networks:
          app:
    
    networks:
      app:
        driver: bridge
    Ответ написан
  • Как правильно вывести подблок с данными на странице?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Можно по-разному реализовать.
    1) Заранее подготовить некий DTО, в котором заранее будут данные пользователя и его отпуски. Соответственно, останется просто итерировать по этому List<DTO>
    2) Если идти, по структуре, как сейчас, то есть персональные данные и данные об отпусках добавляются во вью отдельно, то нужно сделать проверку на ID пользователя.
    Условно говоря, th:if="${el.Trackable_ID == el.PERSON_ID}"
    Я просто не знаю, как ваши поля называются. Т.е. взять ID текущего элемента из trackables и сравнить его с ID человека в deviationsTrackables
    Ответ написан
    Комментировать
  • Каким образом формировать graphql запрос из кода (java, spring) используя dsl решения?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вот, похожий вопрос и соответственно, ответ -
    https://stackoverflow.com/questions/73472972/in-sp...
    Ответ написан
    Комментировать
  • Как в spting валидировать отсутствующие в запросе поля?

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

    Для валидации в спринг бут используется фреймворк - spring-boot-starter-validation
    Используйте его и добавьте необходимые зависимости - NotNull, NotBlank, NotEmpty и т.д.
    Далее на уровне метода контроллера, где в аргументе вы принимаете dto добавьте аннотацию @Valid или @Validated (это разные аннотации.)

    Полезные ссылки
    https://www.baeldung.com/spring-valid-vs-validated
    https://stackoverflow.com/questions/3595160/what-d...

    Ошибку будете получать - `MethodArgumentNotValidException`
    Вот, даже метод для обработки исключения в @RestControllerAdvice
    @ExceptionHandler(MethodArgumentNotValidException.class)
        public ResponseEntity<ErrorMessage> handleValidationExceptions(
                MethodArgumentNotValidException ex,
                WebRequest request
        ) {
            var errorMessage = ErrorMessage.builder()
                    .status(HttpStatus.UNPROCESSABLE_ENTITY.value())
                    .message("Validating problem")
                    .stackTrace(isTraceOn(request) ? getStackTrace(ex) : null)
                    .build();
            if (CollectionUtils.isNotEmpty(ex.getBindingResult().getAllErrors())) {
                ex.getBindingResult().getAllErrors().forEach(
                        error -> {
                            String fieldName = error.getObjectName();
                            String errorText = error.getDefaultMessage();
                            errorMessage.addValidationError(fieldName, errorText);
                        });
            }
    
            return ResponseEntity.unprocessableEntity().body(errorMessage);
        }
    Ответ написан
  • Реализовать вывод результата поиска, с выбором среди результатов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Если вы решили реализовать полнотекстовой поиск, то такие библиотеки, как Hibernate Search, ElasticSearch, Apache Lucene вам в помощь.

    Теперь, что касается вашего функционала, то вот ошибка:
    "Error resolving template [autocomplete], template might not exist or might not be accessible".
    Он не видит шаблон autocomplete.

    Так как не вижу вашего кода, то сделаю смелое предположение, что класс в котором находится эндпоинт autocomplete аннотиирован @Controller
    И если uri - add_trackable возвращает ваш шаблон и корректно работает, то autocomplete не будет работать, так как вы выполняете ajax запрос. Тут 2 варианта - вынести этот эндпоинт в отдельный класс и обозначить, как @RestController . Или же к этому методу добавить @ResponseBody
    К слову, прочитайте про разница @Controller и @RestController
    Ответ написан
    Комментировать
  • Чем заменить deprecated метод http.exceptionHandling() в spring security?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Какую версию Spring Boot используете - 3.0 или 3.1?
    Начиная с версии Spring Boot 3.0 были внесены правки в Spring Security. Теперь, он принимает labda-expression
    Такие же правки произошли в версии 3.1

    Вот, одно из решений - https://stackoverflow.com/questions/76823906/http-...
    Ответ написан
  • Как правильно передать параметры в thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    1) Графики можно рисовать средствами js на стороне фронта без участия бэкенда.
    Например, https://www.chartjs.org/
    2) Для графиков помимо JFreeChart, еще могу посоветовать XChart -
    https://knowm.org/open-source/xchart/
    3) Вы получаете следующее исключение -
    Required request parameter 'x0' for method parameter type double is not present

    В контроллере принимаете int, а в форме возможно передаете число с запятой (тип double)
    Попробуйте это @RequestParam int x0, поменять на @RequestParam double x0,, либо посмотрите почему фронт не отправляет целочисленный тип. Например, можно поэкспериментировать с атрибутом step тега input
    Ответ написан
  • Как обеспечить корректность изменения статусов для записей?

    azerphoenix
    @azerphoenix Автор вопроса, куратор тега Java
    Java Software Engineer
    Хоть Camunda и является хорошим решением, но на данный момент мы остановились на Spring Statemachine.
    Ответ написан
    Комментировать
  • Как часто используется Spring Security? Стоит ли его учить джуну?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Неважно, как именно вы реализуете авторизацию. Spring Security нужно владеть и подключать к проекту.
    Возможно, как джун или интерн вам необязательно знать все об этом фреймворке, то некий базовый минимум все-таки придется изучить
    Ответ написан
    Комментировать
  • Как избежать Out Of Memory Error?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Может, Webflux + tus? При наличии tus не страшен Out Of Memory Error, ибо потом можно будет докачать.
    Ответ написан
    Комментировать
  • Как правильно сгенерировать Html форму в ajax?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день!
    Крайне не поддерживаю вариант с генерацией формы на стороне сервера и отправкой готовой html формы. Больше предпочитаю генерировать json и полученные данные сеттить в имеющуюся форму.
    А так, нет никаких правил. Можно и так и так.
    Ответ написан
    2 комментария
  • Как сохранить данные в PostgreSQL в Spring Data JDBC?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Да, можно каскадно. Можно выставить CascadeType.ALL или как вариант выбрать только MERGE & PERSIST
    Ответ написан
    Комментировать
  • Хорошая ли идея использовать 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 есть соответствующие плагины, которые нужно подключать. (читаем документацию)
    Ответ написан
    Комментировать