• 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
    Ответ написан
    Комментировать
  • Android разработка на Java в Sublime Text?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Давайте, рассмотрим варианты, которые у нас имеются:
    Вы можете использовать Sublime Text 3 для Java разработки. Скажу, что как начинающему разработчику будет чуть сложнее подготовить рабочее пространство под android, с учетом того, что вам нужно скачать различные sdk, установить gradle и т.д.
    Вам понадобится:
    Android SDK Command line tools - https://developer.android.com/studio#downloads
    Sublime Text 3 или 4
    Плагин для Sublime Text 3. Например, Javatar или Andrew
    Gradle (для удобства можно использовать https://sdkman.io/install )
    В качестве OS - с учетом железа можно взять Linux, так как он легче, чем остальные

    В качестве альтернативы можете рассмотреть OSS (Visual Studio Code)
    Вот, минимальные требования для него - https://code.visualstudio.com/docs/supporting/requ...

    Можно попробовать кое-что другое еще...
    Изучить javascript & React Native и писать кросплатформенные приложения на нем. Но что по ресурсам не подскажу.
    Ответ написан
    2 комментария
  • Как скачать файлы по URL?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Итерируете по массиву и для каждой ссылки проводите действие указанное по ссылке ниже. Выбор вариантов скачивания огромен
    https://www.baeldung.com/java-download-file
    Ответ написан
    Комментировать
  • Как эффективно освоить backend-разработку на Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Один мой коллега заявил, что если учить программирование само по себе — по книгам/документации, — то это потеря времени впустую. Нужно делать какой-то проект. У меня такой вопрос: а какой проект можно сделать, если только начал изучать программирование и понятие не имеешь что писать?


    Чтобы знать, что писать - надо знать, как писать. А значит, для начала ты должен овладеть теорией. Хорошо, когда изучая теорию ты попутно учишься писать код. До написания pet project я бы рекомендовал изучить еще исходные коды различных проектов коллег поопытнее. Найти их можно на github, bitbucket и т.д.

    Итак, подведем итог:
    1) изучить теорию
    2) попутно стараться решать задачи на различных сайтах (hackerrank, leetcode и др.)
    3) когда овладеете базовыми навыками, то изучать различные паттерны и подходы. KISS, YAGNI, GRASP, SOLID, GoF, DTO, DAO и т.д.
    4) написать свой pet project.
    Ответ написан
  • С помощью каких фреймоворков создают мобильные приложения на Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Подскажите, с помощью каких фреймоворков создают мобильные и десктоп приложения на Java?

    Добрый день.
    Десктоп - платформа JavaFX. Остальные старые либы, но используются и по сей день. Например, swt, awt, Swing
    Мобайл - на Java пишут нативно под андроид используя Android SDK.
    Под iOS есть вроде бы Multi-OS Engine - https://multi-os-engine.org/ , но я сам никогда его не использовал.
    Если хотите кросплатформенно писать мобайл приложения, то смотрите в сторону React Native (javascript, typescript) или Flutter (Dart). Ну и изучив js можно писать десктоп на ElektonJS
    Ответ написан
    2 комментария
  • Как найти итоговые поступления каждого маршрута за 7 дней?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Это тестовое задагние или реальный проект?
    На всякий случай отмечу, что если вы оперируете с валютой, то для высокой точности стоит использовать тип данных BigDecimal вместо примитивов. Тип данных int тем более не подойдет, так как могут быть не только целые значения.

    Транспортная компания осуществляет работу 10 маршрутов городских автобусов. В конце каждого дня регистрируется выручка по каждому из маршрутов, а в конце недели составляется итоговый отчёт.
    Напишите класс, который моделирует сбор соответствующей информации и выводит на экран итоговые недельные поступления от каждого из 10 маршрутов.

    Предположу, что это тестовое задание или домашка и потому вместо ответа дам вам несколько подсказок.
    1) Создайте класс, который хранит в себе информацию по каждому из маршрутов. Приведу простой пример. Можно учесть много аспектов например, дату и т.д., но не будем.
    Например, (псевдокод):
    class Route {
        int busNum;
        Map<DayOfWeek, BigDecimal> incomePerDay;
    }

    далее вы можете создать массив или использовать jcf для хранения данных.
    Не будем морочиться и возьмем массив:
    Route [] routes = new Route [];
    Инициализируем массив маршрутов. В мапу кладем доход. Ключом является день недели, а значением доход на этот день.
    Далее остается при помощи класса Scanner, который вы используете принять выручку на каждый день недели для каждого из маршрутов.
    После того, как вы примете значения остается итерировать по массиву Route. Внутри цикла получить мапу. Проитерировав по мапе получить значения (доходы) по ключу и вывести сумму (недельный доход) в консоль

    Я условился, что за маршрут можно получить от 1000 до 10000.

    За маршрут можно получить и 550 руб. 50 коп. Целых значений может и не быть
    Ответ написан
    2 комментария
  • Как обновит массив объектов в spring boot?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну во-первых, вам не нужно итерировать по старой и новой коллекции.
    Вы можете либо воспользоваться методом addAll(). либо же раз решили итерировать, то
    создать методы add() и remove()
    Прочитайте эту статью:
    https://vladmihalcea.com/the-best-way-to-map-a-one...
    Для более полного ответа нужно увидеть весь код. Например, вы указали вот, эту строку в комментарии:
    List<Address> addressList = oldUser.getAddress()
    Тут либо действительно проблема. либо метод назван неправильно, так как getAddress() подразумевает получение одного адреса, а не списка адресов пользователя. Должно быть getAddresses(), ну а метод getAddress() должен возвращать 1 адрес
    Рекомендую поставить брейкпоинты и провести дебаг
    Ответ написан
    Комментировать
  • Почему мои куки исчезли? Как мне оставаться в одной сессии?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Если я вас правильно понял, то у вас есть проект на Angular + Spring Boot.
    Не видя исходный код проекта сложно что-либо объективно сказать, но тем не менее постараюсь.
    Итак, рассмотрим простую модель - вы пишете REST приложение. Имеется некий эндпоинт, который принимает логин и пароль и в ответ генерирует jwt (токен). В чуть более сложной модели могуть быть 2 токена - access token & refresh token.
    Затем вам необходимо каждый раз в заголовке этот токен передавать. Например, Bearer xxxxxx
    Не забываем сохранить сам токен в localStorage и каждый раз отправлять его в бэкенд
    Ответ написан
  • Возможно ли поместить в option selected Значение переменной из Thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    <option selected>Как сюда поместить значение  переменной Thymeleaf??</option>
            <option th:each="ru: ${rule}"
                    th:value="${ru.id}"
                    th:text="${ru.name}">
            </option>

    Тут нужно сделать проверку при помощи th:selected
    https://attacomsian.com/blog/thymeleaf-conditional...
    Если я вас правально понял. то атрибут selected нужно добавить, если значение из цикла совпадает со значением из вашей переменной (допустим из БД)?
    Если так, то в цикле th:each вы при помощи th:selected проверяете на совпадение и если значение переменной и элемента из цикла совпадают, то добавляете атрибут.
    Ответ написан
    5 комментариев