• Оправдано ли использование TypeScript для больших проектов?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Именно в больших проектах его применение более чем оправдано.
    Ответ написан
    1 комментарий
  • Зачем нужно DTO в простых сервлетах?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    DTO - data transfer object это шаблон проектирования.
    Варианты использования:
    Из клиента прибегает DTO. После чего он маппита в Entity и сохраняется / обновляется в БД.
    Либо наоборот из БД вы маппите ваши сущности в DTO и отдаете их в нужном виде.
    Это позволяет обезопасить приложение путем создания доп. прослойки. также вы можете отдавать на клиент только нужную для него информацию, а не всю сущность со всеми зависимостями и т.д.
    Также на уровне DTO вы можете провести доп. валидацию отправленных от клиента данных.
    Ответ написан
    Комментировать
  • Какое здесь регулярное выражение можно применить?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    data = data.replaceAll(",\s?(\d{1})", ",\n$1");
    https://regex101.com/r/A5Ffkx/1
    Ответ написан
    Комментировать
  • Как сделать рефакторинг данный код?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Поделюсь своими мыслями. А вы уже сами решайте стоит ли вносить правки в ваш код.
    1) Судя по этому сниппету:
    public void updateUserByInn(List<Users> usersList) {
            for (Users dto : usersList) {

    Метод принимает Dto.
    Ну тут во-первых, класс должен быть в ед. числе Users -> User
    Во-вторых, если это Dto, то это должно быть как-то отображено в названии. Например, UserDto, UserUpdateRequest и т.д.
    А раз это DTO, то маппинг можно вынести в отдельный метод или даже класс. Можно воспользоваться интерфейсом Converter <UserDto, User>, можно подключить либы (ModelMapper, MapStruct).
    Если решите использовать ModelMapper, то обратиться внимание на этот вопрос, дабы исключить null параметры:
    https://stackoverflow.com/questions/45451025/how-t...

    2) Вместо того, чтобы выбрасывать NPЕ можно использовать Optional класс и выбросить кастомное исключение:
    Users user = usersRepository.findByInnAndExternalPartnerId(dto.getInn(), dto.getExternalPartnerId()).orElseThrow(UserNotFoundException::new);

    Для этого из репозитория ваши методы должны возвращать Optional<User>

    3) Сам метод должен быть назван корректно.
    updateUserByInn обновить юзера по ИНН. А в методе вы обновляете пользователей, а не одного юзера еще и притом обновляете не только по Inn, а по ExternalPartnerId тоже. Значит, метод назван некорректно

    Когда вы вынесете дублирующийся код в отдельный метод или даже класс, то код значительно сократиться и станет более читабельным.
    Ответ написан
    Комментировать
  • Как создать метод из SQL запроса?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Ну пожалуй, вам стоило бы уточнить работаете ли вы с jdbc или с Spring JDBC, Spring JPA, Hibernate и т.д.
    В Spring есть такая штука, как exists*
    Например,
    existsCustomerByNameAndPurchase(String name, String purchase);

    Подробнее: https://www.baeldung.com/spring-data-exists-query
    Ну а если jdbc, то в чем проблема? Выполнили SQL запрос. Проверили кол-во записей. Если больше 0, то значит true, если 0 - false
    Ответ написан
    8 комментариев
  • Путь до junior developer (java/kotlin). Сколько времени потребуется?

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

    Лет 10 назад изучал html, css, php, SQL, как хобби.

    Аналогично. Правда, это было 13 лет назад. Я тогда забил на РНР. Первый сайт вообще поднял на Microsoft FrontPage, затем уже пошли различные CMS (Joomla, WP, Drupal). Окончил вуз по другой специальности. 3-4 года фрилансил как ВП разработчик, но в определенный момент надоело клепать сайты и захотелось чего-то большего. Тогда я владел рнр, js на определенном уровне, но писать на нем не было желания. Выбор пал на Java. Начал изучать самостоятельно с 2018 года (писал парсеры, приложения на JavaFX, пару приложений для андроид и т.д.). Но с учетом моей любви к вебу и к энтерпрайз, то в 2020 году прошел 6-мксячный курс по Java Core & Java Enterprise. Сам много чего изучал. Читал книги, брал курсы на udemy, изучал чужой код на гитхаб, брал мелкие, простые заказы, писал пет проекты и т.д.

    Насколько наличие сертификата об окончании платных/бесплатных курсов помогает в поиске работы или работодателя в первую очередь интересуют знания кандидата?

    Разумеется, что знания важнее. А уровень ваших знаний определеляется на собеседовании.

    Путь до junior developer (java/kotlin). Сколько времени потребуется?

    В первую очередь, зависит от вас. На курсах преподаватель может впихнуть в вас весь учебник, но не факт, что вы его запомните. Но минимальное время наверное, 6 мес. Как правило, курс Java Core занимает примерно 3 месяца и Android API занимает тоже 3-4 месяца. Этого времени достаточно для того, чтобы вы устроились в качестве trainee || junior.

    Вот, полезные ссылки, которые помогут вам в достижении ваших целей:
    https://www.hackerrank.com/
    https://refactoring.guru/
    https://www.baeldung.com/
    https://www.it-academy.by/
    tutorials.jenkov.com
    https://www.tutorialspoint.com/java/index.htm
    https://vladmihalcea.com
    https://github.com/enhorse/java-interview
    гугл

    Не забываем про учебники:
    Java head first (хотя его я не очень люблю)
    Г. Шилдт - Полное руководство по Java
    Р. Лафоре - Алгоритмы и структуры данных Java
    Б. Эккель - Философия Java
    Р-Г. Урма - Современный язык Java.
    Б. Гетц - Java Concurrency на практике
    и др.
    Ответ написан
    2 комментария
  • Как разделить строку java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Метод split принимает regexp.
    String str = "Мама мыла раму";
    String[] words = str.split(" ");

    https://javarush.ru/groups/posts/2907-metod-split-...
    Об этом речь?

    Если вы хотите разделить строку, в которой могут быть разное кол-во пробелов между словами
    String str = "Мама      мыла   раму";
    String[] words = str.split("\\s+");
    Ответ написан
    Комментировать
  • Изучаю java 3 й месяц, прошу помочь советом куда двигаться и можно ли начать искать стажировки или пока рано?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Пожалуй, каждый из нас задавался тем, учит ли он актуальную информацию или теряет время. В принципе, все то, что вы описали актуально. Java Core, Java EE, OOP, AOP, Spring (вся экосистема), Hibernate, Jenkins, git, SQL, html, css, xml, json, maven, gradle и т.д.
    Как думаете ,можно(нужно) ли начать искать стажировки с дальнейшим трудоустройством или пока рано?

    Да, можно начать, нужно искать. Если возьмут, то почему бы и нет. Можно даже брать заказы с фриланса и пробовать себя в этой сфере. Для начала брать простые задачи (парсеры, боты), а затем уже повышать скиллы.
    Также очень важно написать пару пет проектов для себя.
    Ответ написан
    3 комментария
  • Как передать объект другому запросу?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Если брать запрос: localhost:8080/ то он должен проверить была ли сделана авторизация, если нет, то делает redirect, если было сделано, то он показывает разметку, в котором уже находятся данные объекта пользователя.


    Вот, например небольшой сниппет:
    @GetMapping("/admin")
        public String dashboard() {
            // Проверка авторизации пользователя
            boolean isAuthorised = SecurityContextHolder.getContext().getAuthentication() != null &&
                    SecurityContextHolder.getContext().getAuthentication().isAuthenticated() &&
                    !(SecurityContextHolder.getContext().getAuthentication() instanceof AnonymousAuthenticationToken);
            if (isAuthorised) {
                return "redirect:/admin/dashboard";
            }
            return REDIRECT_ADMIN_LOGIN;
        }


    Так же было не понятно что после кнопки авторизации, передача объекта другому запросу с помощью redirect. По коду выглядит все так

    В это случае вместо addAttribute() нужно использовать addFlashAttribute()
    Подробности тут - https://stackoverflow.com/questions/14470111/sprin...
    Ответ написан
  • Реализация таблиц Студент и Преподаватель?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день!
    Итак,
    Вам нужны 3 модели:
    1) User (содержит общие поля) - @MappedSuperclass
    2) Student - @Entity
    3) Teacher - @Entity
    Подробнее - https://www.baeldung.com/hibernate-inheritance
    Ответ написан
    Комментировать
  • Этот код является ООП?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Является ли код ООП - да, является. Но как отметил коллега, над ним стоит поработать. Прочитайте про java naming convention.
    Также есть неплохой курс на https://refactoring.guru/refactoring
    Классы должны иметь понятное название
    class B extends A
    Не забываем про camelCase
    b.setage(20);
    Модификатор доступа public в интерфейсе лишний
    interface D {
        public void d();
    }

    Нельзя создать экземпляр абстрактного класса:
    C c = new C();
    Ответ написан
    Комментировать
  • Как скрыть отдельную страницу из верхнего меню wordperss?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день!
    1) Зайти в админку
    2) В разделе "Страницы" - найти эту страницу и отредактировав установить статус черновик (или удалить вовсе)
    3) В разделе "Внешний вид" - "Меню" - удалить данный пункт меню из соответствующего меню (если у вас их несколько)
    Ответ написан
  • Как программно проигрывать ноты гитары?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Довольно интересная затея.
    С учетом своего опыта использования подобных приложений (я играю на электрогитаре), могу сказать то, что есть довольно много приложений, которые воспроизводят звук электрогитары. Самыми известными среди них являются: Ultimate Guitar, Tonebridge, Songsterr, Guitar Tab X. Именно звуки гитары этих приложений максимально дают натуральное звучание. Как вариант, можно постараться декомпилировать их и изучить исходники.
    Я встречал готовую либу, которая способна воспроизводить звук гитары по табулатуре.
    Называется она AlphaTab и судя по заявлению разработчиков, то можно ее использовать и в mobile.
    https://www.alphatab.net/
    Также не знаю поможет ли вам это, но в Java есть пакет javax/sound/midi
    https://habr.com/ru/post/211480/
    Возможно, данная ссылка будет также полезна для вас: https://stackoverflow.com/questions/20393183/javax...
    Ответ написан
    1 комментарий
  • Как в Spring boot Java сформировать подпись?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Так вроде там написано, что нужно сделать. Даже показан код на js.
    Вы хотите интегрировать некий сторонний сервис, куда будете отправлять запрос или как? Если вы хотите у себя формировать некую подпись, то скорее всего нужен контроллер с указанным в задании урлом (нужно больше информации).
    А так если вкратце:
    1) Есть URL, куда нужно отправлять запрос. Для отправки запроса из Spring используйте RestTemplate. Если нужен реактивный стек, то WebClient.
    2) Есть JSON, который нужно отправить в Body. Структура json указана во втором пункте.
    3) Далее есть соль (salt). Для генерации используйте UUID.randomUUID().toString();
    4) Также вам необходимо secret key полученный от Namba One перевести в hmac.
    Вот, пример:
    https://www.baeldung.com/java-hmac
    Ответ написан
    Комментировать
  • Как парсить данные с localhost:8080, используя Jsoup?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Я посмотрел на исходный код проекта и все стало на свои места.
    Во-первых, этот проект использует Vaadin. К сожалению, мне не доводилось использовать его, но я могу сказать следующее:
    Контент страницы формируется динамически на клиенте. JSoup не умеет работать с динамически формируемым контентом и потому, на момент парсинга документа там лишь:
    <div id="outlet"></div>
    Соответственно, чтобы спарсить динамический контент вам нужно:
    1) либо изучить внутренний АПИ и спарсить json, который возвращается извне. Зайдите во вкладку Network (Сеть) браузера и отфильтруйте XHR запросы и гляньте, на какой эндпоинт выполняется запрос и что возвращается в ответ.
    2) либо спарсить сайт при помощи Selenium. (запустить браузер, дождаться загрузки страницы, получить документ, получить List<WebElement>)
    Ответ написан
    1 комментарий
  • Как развернуть локально всю экосистему если дали доступ к vps на которой все в докере?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    1) Можно попробовать создать docker image из контейнера, а затем его развернуть у себя.
    https://www.sentinelone.com/blog/create-docker-image/
    2) Можно создать бекап виртуалки и развернуть его у себя в виртуалке)))
    3) Если это все нужно для дебага, то можно провести удаленный дебаг. Например, xdebug
    4) Как по мне самым адекватным решением должно быть следующее:
    Поднять у себя эти контейнеры на основе Dockerfile. (возможно, используеться docker compose).
    Затем экспортировать БД из продакшна и закинуть его себе.
    Ответ написан
    Комментировать
  • Как зашифровать / обезопасить property файл?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вы можете воспользоваться Java Cryptography Extension
    https://www.oracle.com/java/technologies/javase-jc...
    Ответ написан
    Комментировать
  • DonationAlerts API - Как получить Code, Token через ссылку?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Тут есть документация, где можно подробно прочитать:
    https://www.donationalerts.com/apidoc
    Прочитайте от: "1 - Application Registration" до "3 - Getting Access Token"

    В вашем коде вы не определили значения этих переменных:
    String API_KEY = "API_TOKEN";
            String  APP_ID = "APP_ID";
            String REDIRECT_URI = "REDIRECT_URI";
            String SCOPE = "oauth-donation-index";

    Прочитав указанные выше главы, вы поймете, что нужно вписать туда.
    Ответ написан
  • Как сформировать структуру данных и вернуть на клиент?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Скажите пожалуйста, правильно ли я понимаю, что у вас есть таблица с данными, а также сами сущности (entity) и вы хотите вернуть результат полученный из БД на клиент?
    Т.е. меня интересует следующее: db first or code first?
    Если у вас code first, то значит сущности у вас имеются и вам необходимо создать доп. классы (DTO). Далее полученные данные из БД замаппить в DTO.
    Для маппинга (после того, как будут созданы DTO) можно использовать доп. либы: ModelMapper, MapStruct или же интерфейс Converter<S,T>
    Если хотите создать dto на основе имеющегос у вас json файла, то можно воспользоваться онлайн-сервисом или представляемой ими либой.
    Сервис - https://www.jsonschema2pojo.org/
    Кстати, вы уверены, что у вас в вопросе указаны данные в json?
    Вот, json:
    {
        "id": 1,
        "numberOperation": "010",
        "nameOperation": "Токарная",
        "workshop": 6465,
        "area": 7,
        "OO": true,
        "OTK": false,
        "PZ": true,
        "KPS": true,
        "transition": [
            {
                "id": 1,
                "nameTransition": "Закрепить деталь",
                "executor": [
                {
                    "id": 1,
                    "nameExecutor": "4784",
                    "tsht": "4",
                    "tpz": "9",
                    "test": "7",
                    "tshtCalculated": "",
                    "tpzCalculated": "",
                    "testCalculated": "",
                    "kvr": "973"
                }, ]
            },
    
        ]
    }

    И вот dto построенные на основе вышеуказанного json (обратите внимание, что код скорее всего необходимо подправить под ваши нужды)
    DTOs
    -----------------------------------com.example.Example.java-----------------------------------
    
    package com.example;
    
    import java.util.List;
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "id",
    "numberOperation",
    "nameOperation",
    "workshop",
    "area",
    "OO",
    "OTK",
    "PZ",
    "KPS",
    "transition"
    })
    @Generated("jsonschema2pojo")
    public class Example {
    
    @JsonProperty("id")
    public Long id;
    @JsonProperty("numberOperation")
    public String numberOperation;
    @JsonProperty("nameOperation")
    public String nameOperation;
    @JsonProperty("workshop")
    public Long workshop;
    @JsonProperty("area")
    public Long area;
    @JsonProperty("OO")
    public Boolean oo;
    @JsonProperty("OTK")
    public Boolean otk;
    @JsonProperty("PZ")
    public Boolean pz;
    @JsonProperty("KPS")
    public Boolean kps;
    @JsonProperty("transition")
    public List<Transition> transition = null;
    
    }
    -----------------------------------com.example.Executor.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "id",
    "nameExecutor",
    "tsht",
    "tpz",
    "test",
    "tshtCalculated",
    "tpzCalculated",
    "testCalculated",
    "kvr"
    })
    @Generated("jsonschema2pojo")
    public class Executor {
    
    @JsonProperty("id")
    public Long id;
    @JsonProperty("nameExecutor")
    public String nameExecutor;
    @JsonProperty("tsht")
    public Long tsht;
    @JsonProperty("tpz")
    public Long tpz;
    @JsonProperty("test")
    public Long test;
    @JsonProperty("tshtCalculated")
    public String tshtCalculated;
    @JsonProperty("tpzCalculated")
    public String tpzCalculated;
    @JsonProperty("testCalculated")
    public String testCalculated;
    @JsonProperty("kvr")
    public Long kvr;
    
    }
    -----------------------------------com.example.Transition.java-----------------------------------
    
    package com.example;
    
    import java.util.List;
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "id",
    "nameTransition",
    "executor"
    })
    @Generated("jsonschema2pojo")
    public class Transition {
    
    @JsonProperty("id")
    public Long id;
    @JsonProperty("nameTransition")
    public String nameTransition;
    @JsonProperty("executor")
    public List<Executor> executor = null;
    
    }
    Ответ написан
    Комментировать
  • Можно ли как-то заранее внести данные в базу данных SQLite?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Разумеется можно.
    Вы можете создать некий sql файл и записать туда ваши запросы. А при запуске приложения импортировать их.
    Вот, похожие вопросы:
    https://stackoverflow.com/questions/47466913/sqlit...
    https://stackoverflow.com/questions/22890693/impor...
    Ответ написан
    Комментировать