Задать вопрос
Ответы пользователя по тегу Java
  • Как спроектировать API, чтобы избежать ошибку 504 Gate away?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Проблема в том что, Из-за больших обращений в сторонний API, программа работает слишком долго(5-7 минут) при запуске на прод получаю 504 Gate away.

    Посмотрите в сторону WebFlux. В частности, можно использовать Flux<>

    При каждом итерации цикла используя WebClient стучится с параметром в сторонний API с БД и получает некие данные обратно.

    Есть ли возможность доработать сторонний API? Т.е. принадлежит ли он вам? Если да, то можете добавить доп. контроллер, который позволит массово обрабатывать запросы, тем самым уменьшив кол-во запросов с n до 1.
    Ответ написан
    Комментировать
  • Как обьеденить слова в колекции?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый вечер.
    1) У вас есть проблема тут:
    public String translate(String en) {
    
            for (Map.Entry<String, String> d : dictionary.entrySet())
                System.out.print(d.getValue() + " ");
            return en;
        }

    Вам нужно в метод передать слово на англ. языке, а вернуть слово на русском. А вы передаете и возвращаете англ. слово
    Add a new method translate(String en) which take some string in English, and returns
    its translation in Russian as the value of the type String.


    2) Это по идее, даже лишнее. В задании сказано, что пополнять словарь вы будете при помощи метода addNewWord
    public MyTranslator(HashMap<String, String> dictionary) {
            this.dictionary = dictionary;
        }


    3)
    как правильно нужно написать метод транслейт, что бы он находил в словаре нужно слово, обьеденял с другими и выводил в консоле, как указано в задании?

    Вам нужно используя метод get ввести ключ (слово на англ) и получить перевод ().
    Например,
    public String translate(String en) {
    return this.dictionary.get(en);
        }

    P.S. Тут коллега Dmitry Roo прав. Надо в метод translate получить строку, разбить ее на части, достать переводы с собрать в коллекцию. Я тут ошибся.

    4)
    Add code to read string from console and pass it into translate method. Print result to
    console.

    Создайте метод, который поможет прочитать и добавить слова в словарь из консоли. Смотрите в сторону Scanner, System.in
    Ответ написан
    Комментировать
  • Spring как отправить JSON строку?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    А вы js код откуда-то скопировали или как?
    1) Сама идея возврата json из контроллера в таком виде - не очень. Вам необходимо вернуть dto. А jackson уже сам сериализует в json
    @GetMapping("/json")
      public String getJSON2() {
        return "{ \"id\": 10, \"name\": \"Clementina DuBuque\", \"username\": \"Moriah.Stanton\","
            + " \"email\": \"Rey.Padberg@karina.biz\", "
            + "\"address\": { \"street\": \"Kattie Turnpike\", "
            + "\"suite\": \"Suite 198\", \"city\": \"Lebsackbury\", "
            + "\"zipcode\": \"31428-2261\", \"geo\": { \"lat\": "
            + "\"-38.2386\", \"lng\": \"57.2232\" } }";
      }


    2) Как отметил коллега Dmitry Roo у вас то, что происходит в браузере и то что происходит в js коде - это разные вещи.
    Вот, смотрите:
    В коде ниже вы совершаете GET запрос на /api/json.
    Во-первых, непонятно, что это: data: { command: "GetDriverInfo" },, а главное зачем и как она должна быть обработана контроллером.
    Во-вторых, непонятно какой параметр вы хотите получить:
    console.log(response.driverVer);, если такого параметра driveVer у вас нет в json.
    Ответ написан
    Комментировать
  • Зачем придумали clone(), если можно использовать конструктор копирования?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Думаю, тут дали полный и развернутый ответ на ваш вопрос:
    https://stackoverflow.com/questions/2427883/clone-...
    Ответ написан
    Комментировать
  • Как из вложенных объектов в классе сделать одну таблицу?

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

    Есть правда, следующий вариант (если он вам подойдет):
    Если объект может быть встроенным, то вы можете вместо сущности использовать аннотации @Embeddable & @Embedded
    https://www.baeldung.com/jpa-embedded-embeddable
    Т.е. по факту колонки встраиваемого объекта будут добавлены к основной сущности

    P.S. есть еще один вариант реализации вашей задумки. Возможно, что не самый лучший.
    В общем, если вы используете БД postgres, то объект можно хранить в формате jsonb.
    Из коробки решения нет, но можно подключить доп. либу.
    Вот, похожий вопрос:
    https://stackoverflow.com/questions/51276703/how-t...

    Зависимость:
    <dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-52</artifactId>
        <version>2.2.2</version>
    </dependency>


    @Type(type = "jsonb")
        @Column(columnDefinition = "jsonb")
        private List<Child> children;


    На мой взгляд, лучше не заморачиваться так. Имхо, правильнее создавать отдельные таблицы.
    Ответ написан
    1 комментарий
  • Джава ссылается на удаленный класс при компиляции?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    В общем, ответ на вопрос - имеется ошибка в коде: метод main быть статичным
    Ответ написан
    Комментировать
  • Servlets, где должна быть конвертация в DTO?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Конвертация может быть на разном уровне. Обычно, это на уровне сервиса или контроллера.
    https://www.baeldung.com/entity-to-and-from-dto-fo...
    Ответ написан
    Комментировать
  • Может ли Service иметь репозитории других классов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Могу ли я прямо обратиться к репозиторию Entity A из Service B?

    Да, можно. Другой вопрос - хорошо ли.

    Или мне надо это делать вот так Service B -> Service A -> Repository A?

    Я предпочитаю этот способ.
    Причина следующая:
    Вот, представьте, что на сервисном уровне вы получаете Optional<T> из репозитория и в случае, если объект не найден, то на сервисном уровне выбрасываете исключение orElseThrow(). Ну а далее ExceptionHandler ловит исключение и отдает соответствующий код ошибки и сообщение на фронт.
    Если вы решите из сервиса А обратиться в репозиторий Б, то по факту вам нужно заново получить объект и выбросить исключение в случае, если он не найден, а это уже дублирование кода...
    Псевдокод:
    ServiceA {
    @Autowired
    RepoB repoB;
    @Autowired
    ServiceB serviceB;
    
    // 1 вариант
    List<Job> doSomeJob1(String email){
    User user =  repoB.findUserByEmail(email).orElseThrow(UserNotFoundException::new);
    return user.getJobs();
    }
    
    // 2 вариант
    List<Job> doSomeJob2(String email) {
    User user = serviceB.getUserByEmail(email);
    return user.getJobs();
    }
    
    RepoB {
    Optional<User> findUserByEmail(String email);
    }
    
    ServiceB {
    @Autowired
    RepoB repoB;
    
    User getUserByEmail(String email){
    return repoB.findUserByEmail(email).orElseThrow(UserNotFoundException::new);
    }
    
    }


    Во втором варианте нам не пришлось писать логику и выбрасывать исключение.
    А так многое зависит от проекта, от того, как принято в команде работать и т.д.

    Проблема в том, что у меня все сервисы DTOшки, а для работы Service B нужны нормальные объекты, что делать в таком случае? Неужели создавать отдельные точно такие же методы просто без конверта в дто?

    Я это обычно, делаю по другому. Я возвращаю объекты из сервисов. А если мне нужно DTO, то есть отдельный сервис MapperService, который принимимает дженерик и возвращает соответствующие DTO.
    Ответ написан
    4 комментария
  • Нормально ли кидать эксепшены в 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
    Ответ написан
    Комментировать