• Как именовать два метода один из которых выбрасывает исключение?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Тут можно по-разному поступить. Вот, как это делаю я:

    Способ 1: название методов get* & find*
    User getUserById(Long id) {
    	return userRepository.getReferenceById(id);
    }
    
    Optional<User> findUserById(Long id) {
    	return userRepository.findById(id)
    		.orElseThrow(() -> new NotFoundException());
    }


    Способ 2 - я вообще из сервисов не возвращаю Optional никогда. Ведь, по сути если вы будете этот слой сервиса использовать в другом сервисе, то скорее всего вам понадобится сама сущность, а не Optional, а если данной сущности нет, то какой смысл дальше его сеттить, а значит нужно выбросить исключение. Обратите внимание, что второй метод возвращает DTO
    User findById(Long id) {
    	return userRepository.findById(id)
    			.orElseThrow(() -> new NotFoundException());
    }
    
    UserDTO findUserById(Long id) {
    	return userMapper.toDTO(findById(Long id));
    }


    Способ 3: Если не хотите, чтобы исключение выбрасывалось например.
    Допустим, у вас первый сервисный слой PostService вызывает второй AuthorService, чтобы выполнить findById и засеттить его значение к записи. Если вы выполните это на уровне сервисов, то исключение будет брошено. Но можно сделать это на уровне мапперов и в случае отсутствия записи засеттить null. Если память не изменяет, такое работает в MapStruct с NullValuePropertyMappingStrategy

    Cпособ 4
    Создаю 2 метода. Первый возвращает сущность или выбрасывает исключение, а второй возвращает сущность или нулл
    Ответ написан
  • Возможно ли связывание сущностей через интерфейс в Spring JPA?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день
    Важный момент почему вы решили использовать интерфейс для связки сущностей?
    Вы например, можете создать абстрактный класс и расширить его классами Dog, Cat и т.д.
    Т.е. создаете абстрактный класс Animal. (Обратите внимание на `@Inheritance` )
    А дальше расширяете этот класс другими классами. Ну и связываете Animal с нужными сущностями
    https://www.baeldung.com/hibernate-inheritance
    Ответ написан
  • Как установить Claude desktop app на Windows через прокси?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Я конечно не эксперт в этом, но вот, быстрый поиск дал следующий результат
    https://belapan.by/it/claude-desktop-app-windows
    Можете попробовать и отписаться потом
    Ответ написан
    1 комментарий
  • Как реализовать выбор и подтягивание данных на форму?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Вам нужно использовать jQuery + ajax. Передаете id из первого выбранного поля в бэк. Получаете нужные значения в виде json либо html. Делаете append на странице.
    Ответ написан
    Комментировать
  • Когда лучше использовать cms?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    На самом деле все зависит от ваших навыков, от ТЗ, от бюджета и т.д.
    Может быть заказ, когда вам нужно будет работать не с CMS, a CMF или даже Framework-ом.
    Если человеку нужна динамика и возможность изменять части лендинга, то можете и на CMS натянуть. Я обычно, после верстки подключал WordPress. Это довольно быстро и легко настраивать.
    Ответ написан
    Комментировать
  • Как правильно устанавливать связи в Java Spring между Entity?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    С одной стороны, использование ORM фреймворков упрощает разработку. Но я замечал, что некоторые разработчики работая в рамках ORM напрочь не изучают SQL и конечно же это плохо.
    Hibernate хорош с тем, что упрощает разработку, но иногда его необдуманное применение может привести к проблемам. Например, каскады. Честно говоря, работать с jdbc template, тоже не то. Я бы выбрал бы jooq.
    Кстати, если у вас есть операция с балансом, то надеюсь, что вы используете BigDecimal, а не double или float. Если что погуглите Bigdecimal vs double high precision

    Chapter - крупный раздел, например "Жилье", которое содержит категории.
    Category - соответственно сами категории, продолжая пример - "Свет", "Газ", "Вода".

    В терминологии ВП, chapter - taxonomy, а категория остается как есть.

    Я бы рекомендовал прочитать статьи в блоге Влада Михалки. https://vladmihalcea.com/
    А еще у него в гите есть примеры на relation-ы. Вдруг, тоже будет полезно

    https://github.com/vladmihalcea/high-performance-j...
    Ответ написан
  • Возможно ли подключить PostgreSQL к Wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Во-первых, нужно ли переводить ВП на PG и что это вам даст?
    Во-вторых, могу с уверенностью, сказать, что мускул неплохо справляется с большим количеством данных.
    В-третьих, помню был какой-то плагин, который логировал запросы в БД и можно было смотреть, где происходит просадка. Ну или это можно сделать на стороне БД.
    В-четвертых, можно проверить все ли индексы построены и на каких именно операциях происходит просадка. Например, если у вас поиск работает тяжело, то можно глянуть в сторону ElasticSearch.
    В-пятых, про кеш не забываем. Взять тот же редис например
    Ну и в конце, можно перекинуть данные в Постгрес и глянуть, как он работает на тех же запросах...
    Ответ написан
    Комментировать
  • Что выбрать для отложенного запуска тасок?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день. Я бы выбрал бы CRON
    Если это Spring, то можете глянуть на ScheduledExecutorService или на @Scheduled
    Ответ написан
    Комментировать
  • Как открыть несколько профилей с помощью Selenium WebDriver?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый вечер.
    Вот, ответ на ваш вопрос на пайтон - https://stackoverflow.com/questions/66806112/open-...

    Вот, на C# - https://sqa.stackexchange.com/questions/35542/can-...

    В принципе, можно эту идею перенять и на Java
    Ответ написан
    1 комментарий
  • Как получать Webhooks в Java, какие статьи нужно прочитать?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вот, как это сделать на Spring Boot - https://www.youtube.com/watch?v=tshKOgRLYn0
    Статья по этой же теме
    https://medium.com/@reetesh043/webhooks-for-beginn...

    Вам на спринг или на pure Java?
    Результаты из Google
    Ответ написан
    Комментировать
  • Какие есть Телеграм боты для сокращения ссылок?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Я можно сказать, что не использую сокращатели ссылок, но вот, небольшой список сервисов взятых с реддит.
    Может быть, вы найдете что-нибудь полезное среди них для себя.

    https://t.me/ShortUrlFreeBot
    https://t.me/TinyUrlCreatorBot
    https://t.me/UrlShortenerFreeBot
    https://t.me/GooShortenerBot
    https://t.me/GoogleShortenerBot
    Ответ написан
    Комментировать
  • Почему не видит WebSecurityConfigurerAdapter при попытке импортировать его в класс SecurityConfig?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Приветствую!
    Скорее всего вы используете Spring Boot 3.x, соответственно Spring Security 6.x
    А гайды старые, где все еще есть WebSecurityConfigurerAdapter
    Замечу, что есть также разница между Spring Security 6.0 & 6.1
    https://www.geeksforgeeks.org/authentication-and-a...
    Ответ написан
    Комментировать
  • Пытаюсь подключиться к 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-...
    Ответ написан
  • Как правильно подключиться к двум ДБ?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вот, как это делаю я:
    1) yaml конфигурация
    spring:
      datasource:
        db_1:
          url: jdbc:postgresql://localhost:5432/DB_NAME
          jdbc-url: jdbc:postgresql://localhost:5432/DB_NAME
          username: username
          password: password
          driver-class-name: org.postgresql.Driver
          jpa:
            show-sql: true
            open-in-view: false
            generate-ddl: true
            database-platform: org.hibernate.dialect.PostgreSQL10Dialect
            properties:
              hibernate:
                format_sql: true
                order_inserts: true
                order_updates: true
                jdbc:
                  batch_size: 15
                globally_quoted_identifiers: true
                globally_quoted_identifiers_skip_column_definitions: true
                query:
                  plan_cache_max_size: 4096
                  #fail_on_pagination_over_collection_fetch: true
                  in_clause_parameter_padding: true
            hibernate:
              ddl-auto: update
        db_2:
          url: jdbc:postgresql://localhost:5432/DB_NAME_2
          jdbc-url: jdbc:postgresql://localhost:5432/DB_NAME_2
          username: username
          password: password
          driver-class-name: org.postgresql.Driver
          jpa:
            show-sql: true
            open-in-view: false
            generate-ddl: true
            database-platform: org.hibernate.dialect.PostgreSQL10Dialect
            properties:
              hibernate:
                format_sql: true
                order_inserts: true
                order_updates: true
                jdbc:
                  batch_size: 15
                globally_quoted_identifiers: true
                globally_quoted_identifiers_skip_column_definitions: true
                query:
                  plan_cache_max_size: 4096
                  #fail_on_pagination_over_collection_fetch: true
                  in_clause_parameter_padding: true
            hibernate:
              ddl-auto: update
      jackson:
        serialization:
          FAIL_ON_EMPTY_BEANS: false


    2) Java конфигурация для первой БД
    @Configuration
    @EnableTransactionManagement
    @RequiredArgsConstructor
    @EnableJpaRepositories(
            basePackages = {"com.example.db1.repository"},
            entityManagerFactoryRef = "db1EntityManagerFactory",
            transactionManagerRef = "db1EntityManagerFactory"
    
    )
    public class DB1JpaConfig {
    
        private final Environment env;
    
        @Bean
        @Primary
        @ConfigurationProperties("spring.datasource.db1")
        public DataSourceProperties db1DataSourceProperties() {
            return new DataSourceProperties();
        }
    
    
        @Bean(name = "db1DataSource")
        @Primary
        public DataSource db1DataSource() {
            return db1DataSourceProperties()
                    .initializeDataSourceBuilder()
                    .build();
        }
    
        @Bean(name = "db1EntityManagerFactory")
        @Primary
        public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory(
                @Qualifier("db1DataSource") DataSource dataSource,
                EntityManagerFactoryBuilder builder) {
            HashMap<String, Object> properties = new HashMap<>();
            properties.putAll(hibernateProperties());
            properties.putAll(enversProperties());
    
            return builder
                    .dataSource(dataSource)
                    .properties(properties)
                    .packages("com.example.db1.model")
                    .build();
        }
    
        /**
         * Hibernate properties
         * @return Map of properties for Hibernate
         */
        private Map<String, Object> hibernateProperties() {
            HashMap<String, Object> properties = new HashMap<>();
            properties.put("hibernate.hbm2ddl.auto", env.getProperty("spring.datasource.db1.jpa.hibernate.ddl-auto"));
            properties.put("hibernate.dialect", env.getProperty("spring.datasource.db1.jpa.database-platform"));
            properties.put("hibernate.globally_quoted_identifiers", env.getProperty("spring.datasource.db1.jpa.properties.hibernate.globally_quoted_identifiers"));
            properties.put("hibernate.globally_quoted_identifiers_skip_column_definitions", env.getProperty("spring.datasource.db1.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions"));
            properties.put("hibernate.default_schema", env.getProperty("spring.datasource.db1.jpa.properties.hibernate.default_schema"));
            properties.put("hibernate.format_sql", env.getProperty("spring.datasource.db1.jpa.properties.hibernate.format_sql"));
            properties.put("hibernate.show_sql", env.getProperty("spring.datasource.db1.jpa.show-sql"));
            properties.put("hibernate.order_inserts", env.getProperty("spring.datasource.db1.jpa.properties.hibernate.order_inserts"));
            properties.put("hibernate.order_updates", env.getProperty("spring.datasource.db1.jpa.properties.hibernate.order_updates"));
            properties.put("hibernate.jdbc.batch_size", env.getProperty("spring.datasource.db1.jpa.properties.hibernate.jdbc.batch_size"));
            properties.put("spring.jpa.open-in-view", env.getProperty("spring.datasource.db1.jpa.open-in-view"));
            properties.put("spring.jpa.generate-ddl", env.getProperty("spring.datasource.db1.jpa.generate-ddl"));
            return properties;
        }
    
    
    
        @Bean(name = "db1EntityManagerFactory")
        @Primary
        public PlatformTransactionManager db1EntityManagerFactory(
                @Qualifier("db1EntityManagerFactory") LocalContainerEntityManagerFactoryBean db1EntityManagerFactory) {
            return new JpaTransactionManager(Objects.requireNonNull(db1EntityManagerFactory.getObject()));
        }
    }


    Java конфигурация для 2-й БД (аналогична первому практически)
    @Configuration
    @EnableTransactionManagement
    @RequiredArgsConstructor
    @EnableJpaRepositories(
            basePackages = {"com.example.db2.repository"},
            entityManagerFactoryRef = "db2EntityManagerFactory",
            transactionManagerRef = "db2EntityManagerFactory"
    
    )
    public class DB2JpaConfig {
    
        private final Environment env;
    
        @Bean
        @Primary
        @ConfigurationProperties("spring.datasource.db2")
        public DataSourceProperties db2DataSourceProperties() {
            return new DataSourceProperties();
        }
    
    
        @Bean(name = "db2DataSource")
        @Primary
        public DataSource db2DataSource() {
            return db2DataSourceProperties()
                    .initializeDataSourceBuilder()
                    .build();
        }
    
        @Bean(name = "db2EntityManagerFactory")
        @Primary
        public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory(
                @Qualifier("db2DataSource") DataSource dataSource,
                EntityManagerFactoryBuilder builder) {
            HashMap<String, Object> properties = new HashMap<>();
            properties.putAll(hibernateProperties());
            properties.putAll(enversProperties());
    
            return builder
                    .dataSource(dataSource)
                    .properties(properties)
                    .packages("com.example.db2.model")
                    .build();
        }
    
        /**
         * Hibernate properties
         * @return Map of properties for Hibernate
         */
        private Map<String, Object> hibernateProperties() {
            HashMap<String, Object> properties = new HashMap<>();
            properties.put("hibernate.hbm2ddl.auto", env.getProperty("spring.datasource.db2.jpa.hibernate.ddl-auto"));
            properties.put("hibernate.dialect", env.getProperty("spring.datasource.db2.jpa.database-platform"));
            properties.put("hibernate.globally_quoted_identifiers", env.getProperty("spring.datasource.db2.jpa.properties.hibernate.globally_quoted_identifiers"));
            properties.put("hibernate.globally_quoted_identifiers_skip_column_definitions", env.getProperty("spring.datasource.db2.jpa.properties.hibernate.globally_quoted_identifiers_skip_column_definitions"));
            properties.put("hibernate.default_schema", env.getProperty("spring.datasource.db2.jpa.properties.hibernate.default_schema"));
            properties.put("hibernate.format_sql", env.getProperty("spring.datasource.db2.jpa.properties.hibernate.format_sql"));
            properties.put("hibernate.show_sql", env.getProperty("spring.datasource.db2.jpa.show-sql"));
            properties.put("hibernate.order_inserts", env.getProperty("spring.datasource.db2.jpa.properties.hibernate.order_inserts"));
            properties.put("hibernate.order_updates", env.getProperty("spring.datasource.db2.jpa.properties.hibernate.order_updates"));
            properties.put("hibernate.jdbc.batch_size", env.getProperty("spring.datasource.db2.jpa.properties.hibernate.jdbc.batch_size"));
            properties.put("spring.jpa.open-in-view", env.getProperty("spring.datasource.db2.jpa.open-in-view"));
            properties.put("spring.jpa.generate-ddl", env.getProperty("spring.datasource.db2.jpa.generate-ddl"));
            return properties;
        }
    
    
    
        @Bean(name = "db2EntityManagerFactory")
        @Primary
        public PlatformTransactionManager db2EntityManagerFactory(
                @Qualifier("db2EntityManagerFactory") LocalContainerEntityManagerFactoryBean db2EntityManagerFactory) {
            return new JpaTransactionManager(Objects.requireNonNull(db2EntityManagerFactory.getObject()));
        }
    }


    Когда делаете запрос к БД используйте эту аннотацию:
    import org.springframework.transaction.annotation.Transactional;


    Для первой БД (например, на уровне сервиса):
    @Transactional(transactionManager = "db1TransactionManager")


    или для второй БД

    @Transactional(transactionManager = "db2TransactionManager")
    Ответ написан
    Комментировать
  • Плагин wordpress который парсит видеоролики YOUTUBE по запросу в одну запись?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Когда-то давно я встречал подобный плагин. Увы, уже не являюсь ВП разработчиком и соответственно не помню названия.
    Но можете погуглить.
    Вот, к примеру:
    Related YouTube Videos
    Ответ написан
    Комментировать