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

    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 метода. Первый возвращает сущность или выбрасывает исключение, а второй возвращает сущность или нулл
    Ответ написан
  • Как реализовать выбор и подтягивание данных на форму?

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

    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
    Ответ написан
    Комментировать
  • Почему не видит 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...
    Ответ написан
    Комментировать
  • Реализовать вывод результата поиска, с выбором среди результатов?

    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
    Ответ написан
    Комментировать
  • Как правильно подключиться к двум ДБ?

    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")
    Ответ написан
    Комментировать
  • Как обеспечить корректность изменения статусов для записей?

    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
    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
    Ответ написан
    Комментировать
  • Как можно найти последовательность методов, которые были применены к Java объекту?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Если я правильно понимаю, то вас нужен трейсинг
    https://github.com/btraceio/btrace
    Вот, тут еще есть интересная статья - https://copyprogramming.com/howto/how-to-log-trace...

    Вот, еще по теме - https://stackoverflow.com/questions/1069066/how-ca...

    Вот, средствами самой java - https://www.baeldung.com/java-get-current-stack-trace
    Ответ написан
    1 комментарий
  • Как часто используется Spring Security? Стоит ли его учить джуну?

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

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Многое зависит от ваших умений и знаний, а также от задачи, которую нужно решить..

    Если вы владеете лучше нодой, то пишите на ноде. Другое дело, сможет ли нода решить задачу, которую вам нужно решить. На java написано куча библиотек, которые решают множество повседневных задач. Сам язык и его фреймворки используются в highload cистемах в энтерпрайз.

    Я широко использую язык Java для повседневных задач, но также иногда предпочитаю использовать Go.
    Ответ написан
    Комментировать
  • Как избежать Out Of Memory Error?

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