Ответы пользователя по тегу Java
  • Нормально ли кидать эксепшены в Spring boot web app?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый вечер.
    Да, нормально.
    Само исключение (лог) не нужно отдавать на фронт.
    На фронт отдайте код http ошибки (4хх) и какое-нибудь кастомное сообщение: "Недостаточно средств".
    Посмотрите в сторону ExceptionHandler.
    Ответ написан
    Комментировать
  • Как открыть иной файл в java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Ответ на ваш вопрос:
    https://stackoverflow.com/questions/10685893/run-e...
    Ответ написан
    Комментировать
  • Какие отношения должны быть между этими двумя Entity?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Нечто похожее уже обсуждалось в данном вопросе:
    https://qna.habr.com/q/1111518

    Допустим, что у вас есть сущность Product, а также сущность Order.
    В одном заказе может быть некоторое кол-во одного товара, а значит, вам где-то нужно хранить еще и кол-во заказанного товара.
    Для этого подойдет аггрегация, как вариант.
    Т.е. нужно завести доп. таблицу (например, OrderData), в которой foreign_keys будут являться и product_id и order_id, а также будет. доп. колонка quantity.
    +----------+------------+----------+
    | order_id | product_id | quantity |
    +----------+------------+----------+
    |        1 |          2 |       10 |
    |        2 |          3 |       11 |
    +----------+------------+----------+


    Таким образом, у вас должно получится что-то типа такого (псевдокод):
    Product {
    long productId;
    }
    Order {
    long orderId;
    }
    OrderData {
    Order order;
    Product product;
    int quantity;
    }


    Другой вариант:
    это как указано в вопросе по ссылке выше. Использовать мапу.
    Привожу ссылку на полезный ресурс:
    https://www.baeldung.com/hibernate-persisting-maps
    Что в данном случае должно получиться (псевдокод):
    Product {
    long productId;
    }
    
    Order {
    
    @MapKeyColumn(name = "product_id")
    @Column(name = "quantity")
    Map<Long, Integer>
    }


    В данном случае, мы указываем на MapKeyColumn. Т.е. уник. ключом будет являться идентификатор продукта. А значением будет его кол-во (название указано в Column).

    Наверняка, если подумать еще, то можно найти еще варианты.
    Ответ написан
    Комментировать
  • Как создать Java приложение с Web интерфейсом?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Условно есть страница с кнопкой и полем, я нажимаю на кнопку и выводится скажем "Hello World".

    Если вам нужно очень простое приложение, то стоит начать с изучения сервлетов.
    Вот, простой пример:
    https://www.tutorialspoint.com/servlets/servlets-f...

    Если вам нужно что-то посложнее, то следующим шагом вы можете изучить Spring Framework (Spring Boot). Ссылка - https://start.spring.io/

    Ставить это приложение на сервер или что-то подобное естественно не планирую, все будет запускаться локально.

    Ставить локально контейнер-сервлетов для разработки удобно при помощи sdkman - https://sdkman.io/
    В случае, если вы используете Spring Boot, то в Spring Web есть встроенный Tomcat. Соответственно, вы можете создать самозапускающийся jar || war

    Что для этого нужно? Какие классы/библиотеки/фреймворки для этого нужно использовать?

    Ответ дал выше. Если вдруг захотите разобраться с тем, как вообще начать на Spring Boot: https://www.youtube.com/watch?v=jH17YkBTpI4

    я могу написать приложение на джава, могу сверстать страницу, а как это "присоединить" не понимаю

    Тут могут быть различные варианты.
    1) Самое простое решение - использование шаблонизаторов. Например, thymeleaf, mustache, freemarker. Кстати, в видеоуроках выше даны примеры с mustache & freemarker. Но я предпочитаю работать с thymeleaf.
    2) Полноценное backend REST приложение написанное на Java (Spring) и полноценное frontend приложение напианное на javascript или typescript (Vue, Angular, React). В данном случае вам это не нужно.

    Чтобы понять с тем, как "присоединить" шаблон и ваш код... Думаю, надо разобраться в методах HTTP (GET, POST, PUT ...)
    https://habr.com/ru/post/215117/
    Так вы поймете, как отправлять содержимое формы на сервер и т.д.
    Ответ написан
    Комментировать
  • Как правильно аннотировать @OneToMany, когда используем map в данном случае?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вот, есть наглядная статья по вашему вопросу:
    https://www.baeldung.com/hibernate-persisting-maps
    Ответ написан
    4 комментария
  • Есть 2 варианта кода. Во 2-м варианте при определённом положении оператора return в ветвлении if-else программа выдает ошибку, почему?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Полностью согласен с тем, что написали мои коллеги.
    От себя добавлю, что ваш код можно несколько упростить. Если вам придется сравнивать не 2 или 3 фильма, а допустим штук 100, то вы просто с ума сойдете для каждого из них подбирать комбинацию и строить ветки if else. А значит, должно быть другое "общее" решение.
    Можете ознакомиться с одним из вариантов решения с помощью, которого вы можете сравнить сколько угодно фильмов и без всякого if .. else:
    import java.util.Arrays;
    
    public class Main {
    
        public static void main(String[] args) {
            // Создаем фильмы
            Cinema cinema1 = new Cinema("Титаник", 2194);
            Cinema cinema2 = new Cinema("Аватар", 2810);
            Cinema cinema3 = new Cinema("Тёмный рыцарь", 1084);
            Cinema[] cinemas = new Cinema[]{cinema1, cinema2, cinema3};
            // Находим фильм с большим доходом
            String cinemaTitle = findHighestGrossingFilm(cinemas);
            System.out.println(cinemaTitle);
        }
    
        /**
         * Метод находит фильм с большим доходом
         * @param cinemas массив фильмов для сравнения
         * @return название фильма с большим доходом
         */
        public static String findHighestGrossingFilm(Cinema ... cinemas) {
            Cinema cinemaWithMaxIncome = Arrays.stream(cinemas).max(Cinema::compareTo).get();
            return cinemaWithMaxIncome.name;
        }
    }
    
    class Cinema implements Comparable<Cinema> {
    
        String name;
        int income;
    
        public Cinema(String name, int income) {
            this.name = name;
            this.income = income;
        }
    
        // Имплементируем интерфейс Comparable и сравниваем income объектов
        @Override
        public int compareTo(Cinema c) {
            return Integer.compare(this.income, c.income);
        }
    }
    Ответ написан
    2 комментария
  • Какие онлайн ресурсы посоветуете для изучения Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Вообще я бы посоветовал поискать ответ на хабре, прежде чем задавать вопрос, ибо было дано много подобных ответов.
    Результат поиска - https://qna.habr.com/search?q=%D0%B8%D0%B7%D1%83%D...
    https://qna.habr.com/q/645347
    https://qna.habr.com/q/539385

    Что касается ресурсов, то можете глянуть на habr.com baeldung.com или на medium.com
    Ответ написан
    Комментировать
  • В чем проблема моего switch?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Attempt to invoke virtual method "boolean android.widget.Switch.isChecked()" on a null object reference

    Ну тут как по мне довольно ясно написано, что вы пытаетесь вызвать метод isChecked() на объекте, который null
    Исключение выбрасывается тут:
    edit.putBoolean(APP_MUSIC,sw4.isChecked());
    Потому, что sw4 = null
    А значит, почему-то тут null:
    sw4 = dialog.findViewById(R.id.music);
    Посмотрите есть ли id music.
    Ответ написан
  • Как запустить код Java в VSCODE Windows?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну первое, что попадается в глаза, это ваш исходный код (который кстати, должен быть обрамлен тегом code, а не быть добавлен в виде скриншота, согласно правилам сайта). Писать код на Java удобно используя Intellij IDEA Community Edition или же Eclipse.
    Попробуйте обойтись без VSCode для начала и скопмилируйте проект при помощи консоли.
    При помощи команды cd перейдите в директорию, которая содержит java файл.
    Затем скомпилируйте его в байт-код javac GuessTheGame.java
    После чего попробуйте запустить ваш код через команду java GuessTheGame
    Если будут проблемы, то введите:
    java -version
    и выложите результат выполнения сюда
    Ответ написан
    4 комментария
  • Как исправить ошибку no main manifest attribute in my_app.jar?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Как создал jar файл:
    1) В intellij idea зашел в project structure
    2) Далее выбра artifacts и нажал "+"
    3) далее выбрал jar from modules with dependencies где указал свой main класс
    4) Нажал окей и забилдил проект

    Если не ошибаюсь, то в Intelilj IDEA есть такой баг, когда он добавляет не тот MANIFEST.mf файл. Что-то такое было вроде бы...

    Попробуйте разархивировать ваш jar и глянуть, что написано в этом файле.

    Как отметил коллега Dmitry Roo попробуйте создать новый проект с нуля с указанного сайта и запустите его. Ну а если решите все-таки добить этот, то вся проблема в MANIFEST.mf Видимо, класс указан не тот или сам файл некорректен (например, нет переноса строки и т.д.)
    Ответ написан
    Комментировать
  • Найти работу java без опыта и образовния - невозможно?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Спринг и прочее не очень вникал как работает, но использовать тоже могу для своих целей.

    Пожалуй, именно с изучения этого стека и стоит начать.

    Найти работу java без опыта и образовния — невозможно?

    Можно найти работу. Да, будет сложно. Другое дело, возможно ли найти работу без знания Spring... А что именно вы планируете тогда писать? Парсеры и боты? Ну так можно и на фриланс биржах найти заказчиков.

    Из вариантов в теории сейчас есть только попробовать устроиться через курсы от епама.

    Как по мне, хорошая идея. Можно начать с курсов от Epam. А затем, стажироваться там же и трудоустроиться.

    Можно еще пойти в QA, но тогда вам также нужно изучить соответствующие фреймворки. Например, Mockito, JUnit и т.д.
    Ответ написан
    Комментировать
  • Как собрать java проект на maven в jar файл и поставить на ubuntu server 18.04?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Можно по-разному задеплоить приложение.
    Один из возможных способов это docker или docker-compose.
    Шаги:
    1 - создать Dockerfile, указать как проект должен быть собран, что нужно установить и т.д.
    Например,
    FROM adoptopenjdk/openjdk11:jdk-11.0.10_9-alpine as build
    COPY . /srv
    RUN cd /srv && chmod +x mvnw && ./mvnw clean package
    FROM adoptopenjdk/openjdk11:jdk-11.0.10_9-alpine
    WORKDIR /srv
    COPY --from=build /srv/target/{JAR_NAME}.jar /srv/{JAR_NAME}.jar
    ENTRYPOINT exec java -jar /srv/{JAR_NAME}.jar

    2 - залить проект на гит
    3 - сделать git clone этого проекта на удаленный сервер.
    4 - запустить docker или docker-compose

    Другое более простое решение:
    1 - собрать архив при помощи maven
    mvn clean package
    2 - Полученный архив из директории target/(JAR_NAME).jar закинуть по scp на сервер.
    3 - Установить jre соответствующей версии и запустить проект.
    java -jar /srv/{JAR_NAME}.jar
    Ответ написан
    Комментировать
  • Как поставить телеграм бота java на windows server?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну по-первых, сервер на Windows - плохой выбор. Рекомендую использовать Linux.
    Во-вторых, хоть сервер на Windows, хоть на Linux, а работать придется через терминал (консоль). Необходимо подключиться по ssh и установить jdk и т.д. В данном случае GUI (графическая оболочка) вам не нужна.
    В-третьих, если нужен относительно дешевый vps на linux, то hetzner неплохой.

    Теперь, по существу вопроса:
    1) вам нужна программа для работы с ssh.
    Например, xShell - https://www.netsarang.com/ru/xshell/
    Скачать / установить.
    2) Подключиться к серверу по ssh
    Ввести хост, логин, пароль, порт (возможно, пуб. ключ и т.д.)
    3) Установите Java
    https://www.java.com/en/download/help/silent_insta...
    https://stackoverflow.com/questions/51112065/how-t...
    4) Перекиньте ваш проект на сервер и запустите.
    Ответ написан
    Комментировать
  • Меняют ли аннотации данные в коде?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    В первую очередь, наверное, стоит обратить внимание на это:
    Аннотации представляют собой некие метаданные, которые могут добавлятся в исходный код программы и семантически не влияют на нее, но могут использоваться в процессе анализа кода, компиляции и даже во время выполнения.

    Далее обратите внимание на RetentionPolicy:

    RetentionPolicy.SOURCE - аннотация используется на этапе компиляции и должна отбрасываться компилятором;
    RetentionPolicy.CLASS - аннтоация будет записана в class-файл компилятором, но не должна быть доступна во время выполнения (runtime);
    RetentionPolicy.RUNTIME - аннотация будет записана в class-файл и доступна во время выполнения через reflection.


    Чтобы аннотация "заработала" нужен так называемый Analyzer (Processor)
    Вот, пример процессора:
    https://www.baeldung.com/java-annotation-processin...
    https://thetechstack.net/how-to-process-annotation...
    https://cloudogu.com/en/blog/Java-Annotation-Proce...

    @SQLString(30) String firstName;
    Процессор при помощи рефлексии получит доступ к экземпляру данного класса, затем прочитав данные указанные в аннотации создаст соответсвующую таблицу с соответствующими колонками согласно указанным аннотациям
    Ответ написан
    Комментировать
  • Как отправить запрос в виде url и в ответ получить xml?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    URL на который вы обращаетесь, я так понимаю, что это сторонний сервис? И вы хотите по API обратиться из Spring'a на этот сервис и полученный ответ в xml прочитать и что-то с ним сделать?
    Прочитайте про RestTemplate
    https://www.baeldung.com/rest-template
    Это для отправки запроса на сторонний сервис.

    Вот, пример того, как получить xml и распарсить его в pojo -
    https://stackoverflow.com/questions/36124081/sprin...
    Ответ написан
    Комментировать
  • Не удалось развернуть проект на heroku?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Дополню ответ Dmitry Roo
    Тут указано, что по дефолту используется OpenJDK 8
    https://devcenter.heroku.com/articles/java-support...
    Heroku currently uses OpenJDK 8 to run your application by default.


    Heroku currently uses OpenJDK 8 to run your application by default. OpenJDK versions 17, 15, 13, 11, and 7 are also available. Depending on the major version you select the latest available update of that JDK will be used each time you deploy your app.
    
    Current default versions are:
    
        Java 7 - 1.7.0_332
        Java 8 - 1.8.0_322
        Java 11 - 11.0.14
        Java 13 - 13.0.10
        Java 15 - 15.0.6
        Java 17 - 17.0.2


    Прочитайте главу Specifying a Java version по ссылке выше, чтобы понять, как сменить версию
    Ответ написан
    1 комментарий
  • Пример кода: таблица с фильтрацией с использованием Thymeleaf и Spring ( можно Boot ), как найти?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Ну тут стоит обратить внимание на 2 варианта реализации:
    1) фильтрация / сортировка на стороне клиента средствами js. Т.е. с сервера отдаются данные, а затем уже эти данные сортируются на стороне клиента
    2) фильтрация / сортировка на стороне сервера. А данные уже отдаются в отсортированном виде

    Сортировку и фильтрация на клиентской стороне можно достичь средствами js.
    Вот, готовый продукт:
    Data Tables -
    сортировка - https://datatables.net/examples/basic_init/table_s...
    фильтрация - https://datatables.net/extensions/fixedheader/exam...
    Если нужна серверная фильтрация и сортировка в DataTables, то:
    https://datatables.net/examples/data_sources/serve...

    А вот, готовая либа для Spring, чтобы работать с DataTables. Фильтрация также поддерживается:
    https://github.com/darrachequesne/spring-data-jpa-...

    Вот, кастомный пример сортировка средствами js
    простое нажатие на хедер таблицы

    https://bootsnipp.com/snippets/1erEV

    Теперь, что касается фильтрации и сортировки на серверной стороне средстваами самого Spring:
    https://www.bezkoder.com/spring-boot-pagination-so...
    https://www.baeldung.com/spring-data-jpa-paginatio...

    P.S. у разработчика bezkoder (ссылка выше), также есть страница на гитхаб, где предложены исходники проектов
    Ответ написан
    Комментировать
  • Thymeleaf, как добавить значение по умолчанию для параметра, если он отсутствует при нажатии на ссылку?

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

    Никак. thymeleaf есть на стороне сервера. А нажатие на ссылку происходит на стороне клиента (в браузере), где нет никакого thymeleaf.
    Соответственно, вам нужно валидировать средствами js || jQuery.
    Условно говоря, вещаете обработчик на клик по ссылке
    Погуглите jQuery .on('click', function(){}) или .click()
    Если нет нужного параметра, то средствами js добавляете его и все.
    Ответ написан
    1 комментарий
  • Как исправить ошибку "no main manifest attribute"?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Могу предположить проблемы в самом файле manifest:
    В файле MANIFEST.mf или Manifest.txt нет переноса строки. Из-за чего он игнорирует ваш файл. Убедиться в этом можно, если открыть jar каким-нибудь архиватором и заглянуть в директорию MANIFEST/MANIFEST.mf
    Вот, простой рабочий пример:

    Структура директорий и файлов:
    folder/package1/Dime2.java
    folder/package1/Dime2.class
    folder/MANIFEST.mf


    Выполненные команды:
    Компилируем в байт-код
    javac Dime2.java

    Создаем архив
    jar cfm dime.jar MANIFEST.mf package1/*.class

    Содержимое файла MANIFEST.mf (не забываем про перенос строки)
    Main-Class: package1.Dime2

    Содержимое файла Dime2.jar
    package package1;
    
    public class Dime2{
        public static void main(String [] args){
            try{
                System.out.println("Hello world");
                Thread.sleep(10000);
            } catch(Exception exc){}
        }
    }


    P.S. Обратите внимание на некоторых ОС необходимо дать права на запуск jar файла.
    Например, в linux
    chmod a+x dime.jar

    Ну и запускаем jar'ник
    java -jar dime.jar

    P.S. В примере я показал MANIFEST.mf, но без разницы. Можно и txt использовать
    Ответ написан
    1 комментарий
  • Thymeleaf, th:text не работает, если находится внутри другого th:text, как обойти?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Если память не изменяет, то вам нужен th:inline
    Примерно так:
    <h4 th:inline="text">[[${product.name}]]<span th:text="${product.getPrice()}">45</span></h4>

    Вот, прочитайте этот вопрос:
    https://stackoverflow.com/questions/25071985/thyme...
    Ответ написан
    Комментировать