• Возможно ли подключить 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
    Ответ написан
    Комментировать
  • Как правильно передать параметры в 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.
    Ответ написан
    Комментировать
  • Что нужно для правильного выполнения команды Java -server?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Could not find or load main class ..libs.auth-0.0.1.jar

    такая проблема еще бывает, если у файла permissions не хватает.

    Попробуйте что-то типа
    chmod +x xxx.jar (название jar файла)
    Ответ написан
  • В поиске первой работы програмистом, предлагают бесплатную стажировку. Соглашаться?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    На стажировку-то можно пойти. И возможно, что они могут взять вас на должность Middle разработчика, но от этого вы не станете миддл разработчиком. Вопрос в том, почему они хотят взять вас на эту должность (если это реально так), то например, у них есть серьезная текучка кадров и им нужны новые души. Спросите сколько людей в команде, есть ли тимлид, техлид и т.д. За 3 месяца в нормальных компаниях могут решить стоит ли вас брать на работу в качестве максимум джуна, но никак не миддла. На позицию миддла в своей первой компании я пришел сразу, так как у меня уже был опыт работы на фрилансе, притом не только на Java и куча написанных проектов. Так что... стоит задуматься
    Ответ написан
    Комментировать
  • Как заменить все ссылки в тексте?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Если я вас правильно понимаю, то вы можете использовать jsoup
    Откройте документ, выберите все a[href] замените на нужные, сохраните документ
    https://stackoverflow.com/questions/21529602/jsoup...
    Ответ написан
    1 комментарий
  • Не получается запустить .sh на ubuntu server что делать?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Очень сильно подозреваю, что проблема в chmod.
    Попробуйте выставить на jar - chmod +x ***.jar
    Ответ написан
    Комментировать