Задать вопрос
  • Должны ли переменные final ( не static ) всегда писаться большими буквами?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    В данном случае согласен с коллегой @sergey-gornostaev
    Но вот, что самое интересное:
    https://vertex-academy.com/tutorials/ru/modifikato...
    *Обратите внимание: переменные с final - это константы. При этом их принято писать заглавными буквами - тут CamelStyle не работает :


    Вот, еще интересная выдержка из ответа:

    In java, making something final means that it can't be reasigned to another reference to another instance, but if it's a reference to a mutable class, the mutable values inside the class can still be modified.

    For example, a final String is a constant because Strings are immutable in Java, but a final ArrayList means that you cannot assign it to another ArrayList, but you can still add and remove elements to that ArrayList

    https://stackoverflow.com/questions/39459727/diffe...
    Ответ написан
  • Является ли объявление этой переменной бессмысленной или она улучшает читабельность кода?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    С точки зрения clean code лучше сделать с отдельной переменной.
    Ответ написан
    Комментировать
  • Как правильно конвертировать POJO в XML?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    У вас есть dto - Request, но нет dto Response.

    Вот, примерная структура pojo для Response (источник)
    public class Response { 
    	public int p_id;
    	public int status;
    	public String message;
    	public int id;
    	public Date dts;
    	public String text;
    }


    Также вам для того, чтобы ответ возвращать в xml нужно добавить одну библиотеку для jackson (если вы используете именно его).
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.11.1</version>
    </dependency>

    Подробности тут
    Ответ написан
    Комментировать
  • Как проще всего поднять несколько локальных инстансов приложения для отладки/тестирования?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Как по мне проще всего использовать docker. Можно еще использовать docker-compose, чтобы быстро разворачивать контейнеры с нужными параметрами.
    Ответ написан
    Комментировать
  • Пропали атрибуты в карточке товара после обновления темы, как быть?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.

    если не найду тут ответ напишу им, просто 50$ придется платить им за подписку на поддержу, и не факт еще если помогут)) в любом случае спасибо за ответ

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

    Что касается вашей проблемы, то это происходит по той причине, что ваша тема, в силу отутствия лицензии могла устареть и шаблоны WC могли устареть тоже.

    Попробуйте:
    1) обновить тему до актуальной версии.
    2) откатиться до старой версии WC или восстановить сайт из бекапа.

    Единственный вариант который я вижу и он меня не радует, это экспортировать товар и всю проделанную работу и заново загрузить движок WordPress.

    Это конечно решение, но зачем вам так сильно напрягаться.

    Использую тему *Betheme, лицензия* напомню что после обновления темы а именно с перехода 24.0.3.1 на 25.0.1

    Возможно, что есть некий конфликт. Можете еще попробовать другое решение. Из директории templates внутри плагина woocomemrce скопируйте шаблоны в директорию woocommerce самой темы.
    Ответ написан
    1 комментарий
  • Как понять микросервисы?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день!
    Прежде всего ответьте на один вопрос - какую именно проблему вы хотите решить переходом на микросервисную архитектуру. Обратите внимание, что обеспечивать ACID в микросервисной структуре сложнее, чем в монолитах. Также обслуживание микросервисов тоже сложнее. Если есть нагрузка на сервис, то не факт, что вам нужны микросервисы. Возможно, что вам нужна оптимизация сервиса или более производительное железо.

    Если у каждого сервиса есть свой api, зачем API Gateway (точка входа), можно же на nginx сделать обращение по location на нужный api?

    Например, в случае с Spring API Gateway в нем есть балансировщик. Балансировщик помогает снижать нагрузку с микросервиса, если у вас имеются несколько копий, то каждый раз запросы идут на разные копии. Также gateway удобен тем, что клиент не беспокоится о том, на какой эндпоинт нужно отправлять запрос. Возможно, что у вас несколько копий одного сервиса и то какой из них должен ответить на запрос клиента, самого клиента это не касается.

    Стоит ли использовать RabbitMQ для общения между сервисами? Правильно ли понимаю, что точка входа на ноде, посылает запрос в раббит и ждет от него же ответ и отдает клиенту?

    Можно и через RabbitMQ. А так например, Spring API Gateway использует асинхронные запросы (Spring Webflux) для реализации данной задачи.

    Например делаем микросервис по авторизации пользователя и регистрации. У него должна быть своя база данных?

    Это зависит от вашей задачи. Да, может быть и своя БД. А может быть и нет.

    Получается микросервис отвечающий за пользователей CRUD + Регистрация, авторизация, сброс пароля?

    Опять-таки зависит от вашей задачи, от нагрузки и т.д. Возможно, что регистрация, авторизация и сброс пароля будут отдельными микросервисами. А возможно, что User CRUD будет одним микросервисом.
    Ответ написан
    Комментировать
  • Spring boot - как происходит запуск?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Есть приложение, читающее файлы из файловой системы и загружающее в БД часть содержимого.

    Ну в данном случае для импорта БД нужно использовать sql скрипты и какую-нибудь либу. Например, flyway.

    Есть сервисные классы, в них ряд методов, но возвращаемые типы в методах повторяются.

    Если это необходимо, то можно использовать дженерики.

    Хотелось бы сделать без спринг шелла, без команд в мейне.

    По идее flyway (или например, liquibase) лучше подходят для этих целей.
    Ответ написан
    Комментировать
  • Правильно ли я называю тесты?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вопрос не глупый. Ведь, от правильного нейминга зависит то, насколько хорошо ваш код будет читаемым.
    Вот, информация о конвенции нейминга тестов.
    https://dzone.com/articles/7-popular-unit-test-naming
    Ответ написан
    Комментировать
  • Как выводить посты с разными стилями и разметкой в wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день!
    Я уже давно не занимаюсь ВП разработкой, но вашу задачу можно решить разными способами.
    1) не залезая в рнр код, а только CSS стилями. Например, при помощи псевдоклассов first-child last-child nth-child() и т.д.
    2) с использованием рнр кода (как по мне более предпочтительный по разным причинам).
    Нужно завести свой счетчик вне цикла. В цикле инкрементировать значение и например, если номер поста равен 1, то вывести пост со стилем (большая картинка и т.д.), а если номер поста не равен 1, то вывести пост с другим стилем.
    Ответ написан
    Комментировать
  • Как перевести title в wordpress на странице 404 на английский?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день.
    Все зависит от того, как именно тема была создана.
    Если при создании темы учитывалась i18n & l10n, то скорее всего у вас будут pot & po файлы. В таком случае просто откройте этот файл программой PoEdit или плагином LocoTranslate и найдя нужную строку переведите ее.
    Другое дело, если тема не локализовалась (т.е. некий хардкодинг на уровне шаблона). В этом случае найдите соответствующий шаблон темы (например, 404.рнр) и найдя тег title перепишите его на английский.
    Ну или же можете локализовать тему добавив соответствующие теги обертки и потом уже на основе этих тегов создать pot, а затем уже и po & mo файлы.
    Ответ написан
    Комментировать
  • Как в слое DAO при помощи JDBC получить корректную сущность?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    В Hibernate при использовании аннотации ManyToMany создаются 3 таблицы. 2 таблицы для самих сущностей, где хранится информация и 1 таблица с маппингами, где хранятся id сущностей. В данном случае с вашими таблицами все в порядке.

    У возвращаемого автора должны быть проинициализированы поля books и genres. Там должны находится
    книги которые писал автор и жанры в которых он работал. В свою очередь у каждой книги должна быть
    информация в каком жанре она написана и какие у нее авторы. А жанр должен хранить список книг относящихся к нему
    и авторов работающих в данном жанре.


    При такой работе (при сериализации данных или при вызове метода toString) вы столкнетесь с рекурсией. Например, у автора есть список книг, у книг есть авторы и каждый раз будут вызваны методы, которые будут запрашивать то авторов, которые написали эту книгу, то книги, которые был написаны этим автором. Эти вопросы при работе с Jackson решаются при помощи аннотаций JsonManagedReference & JsonBackReference или JsonIgnore. Для lombok для исключения из toString можно использовать ToString.Ignore.

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

    Если мы говорим о hibernate (jpa), то там есть таккие параметры, как FetchType (EAGER & LAZY). Так вот, если LAZY, то информация из List будет загружена только при обращении к ней. В случае EAGER информация загружается при первом же обращении к сущности.
    https://thorben-janssen.com/entity-mappings-introd...

    Возможно, что эта ссылка будет полезна для вас:
    https://stackoverflow.com/questions/21956042/mappi...
    Ответ написан
  • Как получить доступ к owner?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Вот, гляньте на структуру pojo для вашего json
    Было сгенерировано на сайте - https://www.jsonschema2pojo.org/
    -----------------------------------com.example.Example.java-----------------------------------
    
    package com.example;
    
    import java.util.List;
    import javax.annotation.Generated;
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    @Generated("jsonschema2pojo")
    public class Example {
    
    @SerializedName("total_count")
    @Expose
    public Long totalCount;
    @SerializedName("incomplete_results")
    @Expose
    public Boolean incompleteResults;
    @SerializedName("items")
    @Expose
    public List<Item> items = null;
    
    }
    -----------------------------------com.example.Item.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    @Generated("jsonschema2pojo")
    public class Item {
    
    @SerializedName("id")
    @Expose
    public Long id;
    @SerializedName("node_id")
    @Expose
    public String nodeId;
    @SerializedName("name")
    @Expose
    public String name;
    @SerializedName("full_name")
    @Expose
    public String fullName;
    @SerializedName("private")
    @Expose
    public Boolean _private;
    @SerializedName("owner")
    @Expose
    public Owner owner;
    @SerializedName("html_url")
    @Expose
    public String htmlUrl;
    @SerializedName("description")
    @Expose
    public String description;
    @SerializedName("fork")
    @Expose
    public Boolean fork;
    
    }
    -----------------------------------com.example.Owner.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    @Generated("jsonschema2pojo")
    public class Owner {
    
    @SerializedName("login")
    @Expose
    public String login;
    @SerializedName("id")
    @Expose
    public Long id;
    @SerializedName("node_id")
    @Expose
    public String nodeId;
    @SerializedName("avatar_url")
    @Expose
    public String avatarUrl;
    @SerializedName("gravatar_id")
    @Expose
    public String gravatarId;
    @SerializedName("url")
    @Expose
    public String url;
    @SerializedName("html_url")
    @Expose
    public String htmlUrl;
    @SerializedName("followers_url")
    @Expose
    public String followersUrl;
    @SerializedName("following_url")
    @Expose
    public String followingUrl;
    @SerializedName("gists_url")
    @Expose
    public String gistsUrl;
    @SerializedName("starred_url")
    @Expose
    public String starredUrl;
    @SerializedName("subscriptions_url")
    @Expose
    public String subscriptionsUrl;
    @SerializedName("organizations_url")
    @Expose
    public String organizationsUrl;
    @SerializedName("repos_url")
    @Expose
    public String reposUrl;
    @SerializedName("events_url")
    @Expose
    public String eventsUrl;
    @SerializedName("received_events_url")
    @Expose
    public String receivedEventsUrl;
    @SerializedName("type")
    @Expose
    public String type;
    @SerializedName("site_admin")
    @Expose
    public Boolean siteAdmin;
    
    }
    Ответ написан
    Комментировать
  • Какую аннотацию лучше всего использовать для ролей ( для Hibernate ) в Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Я обычно делаю это иным образом.
    1) создаю enum UserRole, UserPrivilege
    2) создаю entity Role. При необходимости можно еще добавить сет из Privilege для каждой роли
    3) Далее каждый entity содержит роль или сет ролей.
    4) сущность User связываю с сущностью UserRole

    Вот, исходники:
    Сущность User
    @Entity
    @Data
    @Table(name = "users")
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @EqualsAndHashCode(callSuper = false)
    public class User {
    
      //...
    
      @JsonBackReference
      @ToString.Exclude
      @ManyToMany(fetch = FetchType.EAGER)
      @JoinTable(
          name = "users_roles",
          joinColumns = @JoinColumn(name = "user_id"),
          inverseJoinColumns = @JoinColumn(name = "role_id"))
      private Set<Role> roles;
    
    }


    Сущность Role
    @Entity
    @Data
    @EqualsAndHashCode(callSuper = false)
    @Table(name = "roles")
    public class Role implements GrantedAuthority {
    
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      private Long roleId;
    
      @JsonBackReference
      @ToString.Exclude
      @ManyToMany(mappedBy = "roles")
      private Collection<User> users;
    
      @JsonBackReference
      @ToString.Exclude
      @ManyToMany
      @JoinTable(
          name = "roles_privileges",
          joinColumns = @JoinColumn(name = "role_id"),
          inverseJoinColumns = @JoinColumn(name = "privilege_id"))
      private Collection<Privilege> privileges;
    
      @Enumerated(EnumType.STRING)
      private UserRole name;
    
      public Role() {
        super();
      }
    
      public Role(UserRole name) {
        super();
        this.name = name;
      }
    
      @Override
      public String getAuthority() {
        return name.name();
      }
    }


    enum UserRole
    public enum UserRole {
      USER,
      ADMIN
    }


    сущность Privilege
    @Entity
    @Data
    @EqualsAndHashCode(callSuper = false)
    @Table(name = "privileges")
    public class Privilege {
    
      
    
      @Enumerated(EnumType.STRING)
      private UserPrivilege name;
    
      @JsonBackReference
      @ToString.Exclude
      @ManyToMany(mappedBy = "privileges")
      private Collection<Role> roles;
    
    
    }


    enum UserPrivilege
    public enum UserPrivilege {
      ADMIN_PRIVILEGE,
      READ_PRIVILEGE,
      WRITING_COMMENTS_PRIVILEGE
    }
    Ответ написан
    6 комментариев
  • При запуске проекта на эмуляторе получаю Execution failed for task ':app:compileDebugJavaWithJavac', как решить?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый вечер.
    Попробуйте для начала глянуть на ответы, которые были на разных ресурсах по данному вопросу.
    Например,
    https://github.com/gradle/gradle/issues/15538
    https://github.com/gradle/gradle/issues/16641
    Гугл
    Ответ написан
    Комментировать
  • Почему Spring Security отказывается пускать, несмотря на permitall()?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Я бы попробовал сделать следующее:
    1) изменить урл и попробовать заново. Например, /admin/**
    2) также попробуйте подебажить проект. Например, что возвращает:
    Role.ADMIN.getAuthority() и что ожидается на вход
    Ответ написан
    Комментировать
  • Как дублировать буквы в строке?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Можно по-разному реализовать. Например, использовать стримы (как отметил коллега Dmitry Roo) или например, использовать метод repeat()

    Scanner scanner = new Scanner(System.in);
            System.out.println("Введите слово\n");
            String word = scanner.nextLine();
            String[] splittedWord = word.split("");
            for (String character : splittedWord) {
                System.out.print(character.repeat(3));
            }
    Ответ написан
    5 комментариев
  • Чьи объекты использовать: сервера или клиента?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Я сделал зависимость клиента от сервера, то есть удалил класс User из клиента и импортировал этот класс из серверного модуля.

    Можно создать модуль common и закинуть туда ваши общие классы.
    Я вообще делаю примрено следующим образом: создаю несколько модулей один из которых persistence, где располагаются сущности и репозитории, второй модуль common, где содержатся утильные классы и сервисные классы, а также модуль web (где хранятся контроллеры, мапперы, соответсвующие эксепшены и их обработчики, шаблоны и т.д.). Ну и дальше уже по необходимости... например, модуль api для rest. Также создаю отдельный модуль для flyway и хранения sql скриптов. Разумеется, что структура у вас может отличаться в зависимости от вашей задачи..
    Ответ написан
    Комментировать
  • Как изучать Spring? Где нормальная документация?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Подскажите как лучше изучать spring, какой современный стек?

    Пожалуй, все фреймворки изучаются на основе книг, документаций, а также туториалов. Спринг не является исключением.

    Туториалы: John Thompson - (Spring Guru)
    https://www.udemy.com/courses/search/?q=john+thomp...
    Есть чуть попроще Dan Vega - Learn Spring Boot
    https://www.udemy.com/course/spring-boot-intro/
    Также Наиль Алишев - Spring Framework
    https://www.youtube.com/watch?v=5ePo08sqcpk

    Что касается книг, то можно начать с Spring Boot in Action (Spring Boot в действии)

    Что касается документаций:
    https://docs.spring.io/spring-boot/docs/current/re...
    https://www.baeldung.com/

    Ну и у baeldang есть неплохие курсы по Spring
    https://www.baeldung.com/learn-spring-course
    Ответ написан
    Комментировать
  • Как полученный POST запрос с JSON телом, обработать и отдать ответ в виде XML?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    У вас должно быть 2 DTO.
    1 - для получения json из POST запроса.
    2 - для возврата xml в ответе.
    После обработки json вам нужен некий маппер (можно использовать интерфейс Converter<S,T>), который сконвертирует ваш Request в Response.
    Тут должно быть примерно так:
    @PostMapping(path = "/save", 
       produces = {"application/xml", "text/xml"}, consumes = 
                    MediaType.ALL_VALUE)
      public ResponseEntity<Response> pay(@RequestBody Request request){
        service.save(request);
    // тут конвертируем request в response
        return ResponseEntity.ok(response);
          }
       }


    Вот, примерная структура dto для xml response
    public class response { 
    	public int p_id;
    	public int status;
    	public String message;
    	public int id;
    	public Date dts;
    	public String text;
    }
    Ответ написан
    Комментировать
  • Меняется класс только при новом открытии приложения?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Предположу, что вам нужно добавить некий слушатель, который будет отслеживать изменение состояния чекбокса, а затем добавит соответствующий класс.
    А то сейчас происходит следующее: вы изменяете состояние чекбокса, но проверка происходит раньше. При последующем запуске приложения вновь проверяется условие и так как чекбокс уже выбран, то класс добавляется.
    Гляньте на этот код:
    https://www.tutorialspoint.com/javafx-example-to-s...
    В частности обратите внимание на Observable
    Ответ написан
    Комментировать