• Простая оркестрация контейнеров?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Могу рассказать, как это решается на Java + Spring.
    Конфигурацию микросервисов можно сделать централизованной. Для этого необходимо развернуть amqp сервис. Например, rabbitmq.
    Конфигурация при этом выносится в отдельный репозиторий и хранится там.
    Далее каждый из микросервисов при старте знает, что ему нужно обратиться к микросервису, который отвечает за конфигурации. Также они подписываются на событие к rabbitmq.
    Когда в гит репозиторий пушатся конфиги, то конфиг сервер кидает их в rabbitmq, а они в свою очередь забираются микросервисом и проводится динамическое обновление конфигов.
    Скорее всего, на python есть некий похожий сервис для этих целей.
    Ответ написан
  • Как проверить в регулярном выражение ip адрес на java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Пробовали метод из зависимости apache.commons.utility?
    https://commons.apache.org/proper/commons-validato...
    Ответ написан
  • Какая будет связь между классом и интерфейсом на UML языке?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    На UML отображен пример того, как абстрактный класс реализует интерфейс. И как класс расширяет абстрактный класс.
    62ce7fb237827268009814.png
    В первом случае используется realization, во втором генерализация.
    Кстати, очень удобная программа Visual Paradigm Community для проектирования
    Ответ написан
    Комментировать
  • TypeScript делает из JS СИ подобный язык?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    TypeScript ничего с js не делает. TypeScript является языком со статической типизацией (типы задаются в начале, как в Java || C#).
    Другое дело, что во фронте ts код транспилируют в js код. После транспайлинга в js нет никакой типизации и т.д.
    Php является C подобным языком, также как и C#, Java, C++, PHP и др. Например, пайтон не является Си подобным языком

    ему не нужны расширения как TS

    Что вы подразумеваете под расширениями? TS, также как и другие языки использует либы, которые расширяют функционал, если об этом речь
    Ответ написан
    7 комментариев
  • Как лучше хранить данные в MySQL для проекта Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Как вариант вы можете хранить данные в виде json. Есть либа для hibernate - hibernate types

    Но т.к. могут быть разные шаблоны html, то невозможно хранить данные для заполнения в одном конкретном классе.

    Так не храните в конкретном классе. Создайте 1 общий родительский класс с общими полями. А также необходимые дочерние классы (по 1 на каждый шаблон).
    А далее используйте https://www.baeldung.com/hibernate-inheritance

    Краткий принцип работы: происходит добавления емейла в очередь в БД, через некоторое время специальный сервис отправляет это сообщение.

    Я так понимаю, что это некий amqp сервис (rabbitmq, kafka и др), который слушает event и пр наличии отправляет майл?
    Ответ написан
    Комментировать
  • Пишут ли приложения с нуля на Java в 2022?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Да, пишут. На Java есть и легаси и это показатель того, что язык не умер и умрет далеко не скоро.
    К тому же зная java вы можете в любое время переключиться на другие jvm языки - scala, kotlin, closure и т.д.
    Ответ написан
    Комментировать
  • Проблема с подключением PostgreSQL к Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вопрос 1 - где установлена БД PostgresSQL.
    Я так понимаю, что вы хотите подключиться к удаленной БД из моб. телефона? Если да, то попробуйте для начала проверить соединение без android. Например, на чистом Java

    Вопрос 2 - насколько корректно указаны конфиги? Например, номер порта 5432

    String url = "jdbc:postgres://тут правильный url";
        String user = "юзер правильно указан";
        String password = "пароль тоже правильно указан";


    Вообще скажу, что не очень хорошая практика делать приложение, которое коннектится к БД напрямую из приложения. Обычно, для этого пишут API (rest сервис)

    Также рекомендую использовать ORM и try with resources
    Ответ написан
    2 комментария
  • Почему докер не запускается с первого раза?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Вам скорее всего необходим rootless режим.
    https://docs.docker.com/engine/security/rootless/
    Ответ написан
    Комментировать
  • Intellij жалуется на наличие jdk, но у меня установлен 18 jdk, как исправить ситуацию?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Там вверху есть синяя полоска и написано, что jdk 11 не найден. Также предлагает скачать jdk 11.
    Ваш проект использует jdk 11. Нажмите ctrl + shift + alt + S и в настройках выберите соответствующий jdk.
    Ответ написан
  • Как soap-запрос сконвертировать в pojo?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Прочитайте статью по ссылке:
    https://www.baeldung.com/spring-boot-soap-web-service
    Обратите внимание на пункт:
    Generate the Domain Java Classes
    Ответ написан
    Комментировать
  • Как запустить docker на MacOs без Docker Desktop?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    Аналогичная поблема бывает и на Linux тоже.

    Вот, решение для Linux - https://stackoverflow.com/questions/44678725/canno...
    Вот, решение для MacOS - https://stackoverflow.com/questions/44084846/canno...
    Ответ написан
    Комментировать
  • Как разделить логику внутри метода?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Если вы установите Sonarlint, то наверняка он пожалуется на то, что ваш метод можно упростить.
    Также обратите внимание на то, что 1 метод должен отвечать за 1 функционал.
    Если у вас в названии метода есть например, ключевое слово And, то как минимум ваш метод можно разделить на 2 метода. На сайте refactoring.gugu есть неплохой видеокурс и книга по clean code. Но наверное, все же стоит обратиться к более академическим источникам.

    Вот, эту строку можно вынести в отдельный метод:
    Optional<User> user = userRepositoyry.findById(id)
    Например,
    public User findUserById(Long id) {
    	userRepository.findById(id)
    	.orElseThrow(ResourceNotFoundException::new);
    }


    // Запись файлов для необходимой логики, логирование, обработка входных и выходных данных и т.д.

    Логирование

    Наверное, не самая лучшая идея с точки зрения простоты реализации, но можно использовать возможности AOP для логирования. Например, если вы используете Spring, то вы можете использовать Spring AOP (before, after, around, afterReturn)
    Обработку входных и выходных данных можно вынести в отдельные приватные методы.

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

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Ну я бы посоветовал создать несколько профилей.
    Например, dev & prod.
    В dev вы можете делать, что хотите. Например,
    spring.jpa.hibernate.ddl-auto = update (или create)

    А вот, в prod лучше установить
    spring.jpa.hibernate.ddl-auto = none (или validate)
    и воспользоваться возможностями миграции БД. Например, flyway или liquibase. Если нужен простой вариант, то flyway. Но я бы рекомендовал liquibase.
    Ответ написан
    1 комментарий
  • Что лучше начать учить Kotlin или Java если вообще нет опыта в IT?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Пожалуй, язык стоит изучить в соответствии с вашими пожеланиями.
    Если вы хотите податься в enterprise, то лучше Java, но и на Kotline сможете найти работу.
    Если речь идет об android разработке, то лучше Kotlin, но и на Java скорее всего вы найдете работу. Хотя в данном случае лучше для моб. разработки изучите Kotlin.
    Для gamedev-a не стоит изучать ни тот, ни другой. Возможно, C# (Unity), C, C++ будут более годными.
    Для e-commerce python, ruby, php, javascript.
    Если душа лежит во фронт. то есть смысл изучить javascript или typescript (в любое случае владеть js нужно будет).
    Ответ написан
  • В какую технологию нынче податься начинающему бекендеру?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Доброго времени суток!
    Ну во-первых, стоит определиться с тем хотите ли вы податься в enterprise разработку или пойти в e-commerce. Так как сфера применения Spring (Quarkus, ASP.NET) и Laravel (Yii2, Django, RoR) разная.
    Ответив на это вопрос станет яснее какие технологии вам стоит изучить.

    JAVA и её фреймворк меня, на уровне языка, вполне себе устраивают. Статическая типизация, ООП, все дела. Не устраивает меня факт того, что здесь меня ждет бесконечный легаси-код и то, что на рынке труда на вакансиях джавы либо часто не указана степень квалификации, либо это обязательно сеньор-помидор и никто иной. Что странно, зарплаты в этих вакансиях тоже часто скрыты. Не язык, а тайна.

    В Java конечно есть нехватка сеньор разработчиков, но найти вакансию на Junior || Middle тоже вполне возможно. Что касается зарплаты, то все индивидуально. Главное, уточнить этот аспект у HR.

    Так как питон меня вот прям совсем не интересует, выбор стоит между спрингом и пыхой.

    Тут уже каждому свое. Я бы например, выбирал между другими языками. Например, Java, Python, Go, Scala, Ruby, Kotlin. JS, TS и т.д, хоть и мне доводилось писать на PHP, но он как-то мне не приглянулся.
    Ответ написан
    Комментировать
  • Spring JPA, как обновить данные в модальном окне?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    th:href="@{findOne/(id=${tour.id})}"
    Глянув на этот участок кода могу сказать следующее - не передавайте саму сущность на фронт. Вместо этого используйте паттерн DTO. Т.е. для создания / обновления используйте DTO, который затем в сервисном слое маппите в entity и сохраняете в БД,
    Для маппинга можно использовать разные либы.
    Например, интерфейс Converter<S, T> или же либу MapStruct, ModelMapper и др.
    Также можно использовать BeanUtils.copyProperties() например, для обновления сущности.

    @ResponseBody
        public Tour findOne(Integer id) {
            return tourRepository.findById(id).get();
        }

    Вместо get() лучше использовать например, orElseThrow() и выбросить исключение, которое впоследствиее можно при помощи ExceptionHandler обработать и вернуть корректный http ответ. Например, когда объект не найден (404)

    @Autowired
        private TourRepository tourRepository;
        @PostMapping("/save")
        public String save(@ModelAttribute(name = "tour") Tour tour) {
            tourRepository.save(tour);
            return "redirect:/";
        }
        @PostMapping("/admin/saveTour")
        public String saveTourInModal(@ModelAttribute(name = "tour") Tour tour) {
            tourRepository.save(tour);
            return "redirect:/admin/tourList";
        }

    Нет смысла в двух одинаковых методах внутри одного контроллера. Есть смысл вынести эндпоинты отвечающие за админку в отдельный контроллер.

    Само модальное окно вызывается и заполняется данными объекта. После нажатия на кнопку сохранения, у меня стало выводить исключение org.hibernate.exception.ConstraintViolationException: could not execute statement, и что поля бд title и description не могут быть null.

    Вопрос в том, почему они были null, если вы делаете сабмит формы. Попробуйте глянуть в консоли браузера во вкладке "Сеть", какие именно данные отправляются в бэк. Также в режиме дебага проверьте, что именно вы принимаете и сохраняете в БД.

    Обратите внимание, что на одной странице вы делаете update
    Hibernate: update tour set description=?, end_time=?, image=?, price=?, start_time=?, title=? where code=?

    А на другой странице insert
    Hibernate: insert into tour (description, end_time, image, price, start_time, title) values (?, ?, ?, ?, ?, ?)


    Для более точного ответа нужен исходник проекта, ибо я не вижу кода сущности
    Ответ написан
    Комментировать
  • Как натянуть frontend (React + JS) на backend (Java + Spring)?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну натягивать точно ничего не стоит)
    Что касается вашего вопроса, то в backend должен быть написать RESTful сервис (API).
    В отличие от работы с шаблонизаторами (thymeleaf, mustache) фронт-энд является отдельным приложением, которое не связано с бэк-эндом. Т.е. абсолютно все равно на чем написан бэк будь то Spring, Django и т.д.
    Соответственно. когда у вас будет готов REST сервис, то вы можете приступать к разработке фронта.
    Чтобы разработать сервис на Spring можете начать с изучения аннотации @RestController
    https://www.baeldung.com/spring-controller-vs-rest...
    Вы также можете воспользоваться возможностями Spring Data REST, который сам сгенерирует необходимые эндпоинты с поддержкой HATEOAS.
    https://www.baeldung.com/spring-data-rest-intro

    Что касается React, то:
    https://www.youtube.com/watch?v=GNrdg3PzpJQ
    гуглим
    Ответ написан
    Комментировать
  • Как можно упростить этот java код?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день. А можно ли узнать вашу конечную цель? Что вы пытаетесь реализовать?
    Код действительно можно сократить, а то и лучше улучшить восприятие.
    1) создайте 2 метода, первый из которых будет читать файл, а второй писать в файл. Можно воспользоваться возможностями класса Files из Java 8
    2)
    String match1 = sc.nextLine();
            String match2 = sc.nextLine();
            String match3 = sc.nextLine();
            String match4 = sc.nextLine();
            
            String scMatch1[] = match1.split(" ");
            String scMatch2[] = match2.split(" ");
            String scMatch3[] = match3.split(" ");
            String scMatch4[] = match4.split(" ");
    
            int a1 = Integer.parseInt(scMatch1[0]);
            int a2 = Integer.parseInt(scMatch2[0]);
            int a3 = Integer.parseInt(scMatch3[0]);
            int a4 = Integer.parseInt(scMatch4[0]);
    
            int b1 = Integer.parseInt(scMatch1[1]);
            int b2 = Integer.parseInt(scMatch2[1]);
            int b3 = Integer.parseInt(scMatch3[1]);
            int b4 = Integer.parseInt(scMatch4[1]);

    тут происходит что-то странное. Скорее всего тут есть ошибка.
    Вы сперва читаете строку, затем разделяете ее пробелом в массив строк, но потом почему-то присваиваете a1, а2. а3. а4 одно и то же число.
    int a1 = Integer.parseInt(scMatch1[0]);
            int a2 = Integer.parseInt(scMatch2[0]);
            int a3 = Integer.parseInt(scMatch3[0]);
            int a4 = Integer.parseInt(scMatch4[0]);

    скорее всего должно быть так:
    int a1 = Integer.parseInt(scMatch1[0]);
            int a2 = Integer.parseInt(scMatch2[1]);
            int a3 = Integer.parseInt(scMatch3[2]);
            int a4 = Integer.parseInt(scMatch4[3]);

    Такая же ситуация с перемеными b1, b2, b3, b4.
    А что если человек введет не 4 элемента через пробел, а 5 и более? Или наоборот менее 4-х элементов?

    Подобные выражения a1+a2+a3+a4 > b1+b2+b3+b4 с точки зрения clean code можно вынести в отдельную переменную типа boolean.
    Например,
    boolean isSumAGreaterThanSumB = a1+a2+a3+a4 > b1+b2+b3+b4;

    Ну а далее if (isSumAGreaterThanSumB ) { ... }
    Ответ написан
    Комментировать
  • Как работать с WSDL SOAP в Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Есть хорошая статья по вашему вопросу:
    https://www.baeldung.com/spring-soap-web-service
    Не читали случайно?
    Ответ написан
    Комментировать
  • Установка Redmine в контейнер докер, ubuntu?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Вы можете использовать оф. образ Redmine.
    Поищите на https://hub.docker.com/
    Вот, например: https://hub.docker.com/_/redmine
    Либо вы можете воспользоваться образами от Bitnami -
    https://bitnami.com/stack/redmine/containers
    https://hub.docker.com/r/bitnami/redmine

    После установки docker на машину, запустите docker pull redmine

    Можете еще воспользоваться docker compose (сперва нужно установить).
    Дальше остается лишь запустить файл конфигурации.
    Вот, конфиг - https://github.com/bitnami/bitnami-docker-redmine/...
    Скопировать себе yml файл. В консоли набрать
    docker compose -f docker-compose.yml up -d
    Ответ написан
    Комментировать