• Как запускать docker контейнер по CRONу?

    azerphoenix
    @azerphoenix Автор вопроса
    Добрый вечер. Правильно ли я понимаю, что речь примерно о таком:

    */5 * * * * docker run --rm example_app_image:latest /example-scheduled-task.sh

    https://www.cloudsavvyit.com/9033/how-to-use-cron-...
  • Как запускать docker контейнер по CRONу?

    azerphoenix
    @azerphoenix Автор вопроса
    сергей кузьмин, добрый вечер. Это парсер новостей для одного WP сайта, который через REST API публикует записи. Необходимо периодически парсер запускать. Я могу конечно добавить Spring и используя аннотацию @Scheduled запланировать периодический запуск приложения (вообще, надо будет подумать над этим, может действительно стоит так и сделать).
  • Как запускать docker контейнер по CRONу?

    azerphoenix
    @azerphoenix Автор вопроса
    Drno, добрый день. Не очень вас понял, если честно
    docker-compose run -d config
  • Как правильно добавить фронт к spring boot rest api?

    azerphoenix
    @azerphoenix Куратор тега Spring
    На всех контроллерах, кроме Auth, требуется JWT.

    Еще стоит метод для обновления токена тоже делать без авторизации.
  • Как отредактировать форму поиска на сайте Wordpress?

    Said927,
    чтобы починить что-то нужно для начала разобраться с тем, что вызвало поломку. Для этого вам нужно провести дебаг. Проблема может быть как на клиенте (ищите ошибку js), так и на сервере (ищите ошибку в рнр, в плагине и т.д.).
    К слову, на момент просмотра сайта поиск работает корректно.
  • Как вызвать класс нажатием кнопки?

    azerphoenix
    @azerphoenix Куратор тега Java
    Rudy9966, добрый вечер.
    Невозможно вызвать класс или объект. Можно вызвать статичный метод класса или создать экземпляр класса и вызвать нестатичный метод.

    Допустим, что в классе InfoFrame есть некий статичный метод, который выводит в stdout текст hello world:
    public class InfoFrame {
    
    public static void customMethod() {
    System.out.println("Hello world");
    }
    
    }


    class ButtonEventListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
          InfoFrame.customMethod();
        }
      }


    Или же сделать, как указал в своем примере BorLaze - создать экземпляр класса и вызвать нестатичный метод.

    Но если у тебя вдруг есть желание на бутылочку пива заработать)

    Я так понимаю, что речь идет о пустой бутылочке пива?))) Ибо что это за пиво за доллар)))
  • Как отредактировать форму поиска на сайте Wordpress?

    Said927,

    Я установил этот плагин, можете пожалуйста написать как им пользоваться?

    В общем-то надо через админку настроить этот поиск и вывести в нужном месте вашего сайта. Писать долго да и наизусть-то я не помню.
    Вот, документация - https://documentation.ajaxsearchpro.com/getting-started

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

    Можно постараться это починить, но в любом случае готовый плагин будет работать вразы лучше и функциональнее.
  • Почему в Java коде ошибки?

    azerphoenix
    @azerphoenix Куратор тега Java
    Добрый день!
    Ну во-первых, наверное будет правильно сказать, что вы изучаете android разработку, а не android studio, хотя в каком-то смысле в процессе изучения разработки вы постигаете азы работы с IDE.
    Также соглашусь с GavriKos в том плане, что если вы только начали изучать разработку, то нет смысла сразу же изучать реверс инженеринг. Начните с азов. Наверное, стоит также изучить kotlin. Можно начать с startandroid или с подобных ему сайтов.
  • Как в Spring правильно создавать и инжектить сервисы?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Степан,
    Если ответить на ваш вопрос простыми словами, то в контроллер инжектите интерфейс (и создаете сервис, который имплементирует этот сервис). А в сервис уже инжектятся другие интерфейсы и сервисы, а также репозитории и конвертеры и прочее.

    Или в сервисы можно инжектить только другие сервисы?

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

    Сломаться может следующее (как вариант):
    circular dependencies - https://www.baeldung.com/circular-dependencies-in-...

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

    azerphoenix
    @azerphoenix Куратор тега Java
    Amir Kenesbay,

    Еще вопрос, а вообще как закрепить знания на все эти темы по коллекциям, может быть есть некоторые источники?

    Конечно же есть:
    1) Роберт Лафоре - Алгоритмы и структуры данных Java (книга)
    2) Data structures & algorithms - Tim Buchalka (курс на Udemy)
    список можно продолжить дальше... в общем, ищите структуры данных и алгоритмы java и читайте статьи. Можно еще решить задачки на hackerrank и подобных сайтах
  • Как ограничить права на редактирование записей?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Nightmare058,

    Получается, в каждой записи мне нужно хранить id создателя.

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

    azerphoenix
    @azerphoenix Куратор тега Java
    Amir Kenesbay, как вариант, да вы можете конветировать String -> int, а затем уже сортировать.
    Вот, похожий вопрос - https://stackoverflow.com/questions/41562158/how-t...
  • Как сделать sql запрос из MySQL в TableView?

    azerphoenix
    @azerphoenix Куратор тега Java
    BaLahmuT, если вы используете Spring и при этом приложение не клиент-серверное, то воспользуйтесь возможностями ORM (Spring Data JPA).
    Долго писать примеры подключения и настройки hibernate. Я лучше дам ссылки на полезные ресурсы.

    https://spring.io/guides/gs/accessing-data-jpa/

    Если вкратце, то:
    - средствами java вы создаете сущности и связываете их друг с другом.
    - на основе вашего кода в БД создаются соответствующие таблицы
    - используя DAO (Data Access Object, Repository) вы пишете методы, которые выполняют запрос в БД и возвращают информацию. Например,
    List<User> users = userRepository.findAll();
    - а дальше вы уже отрисовываете полученный ответ из БД в таблице
  • Как добавить проверку на ввод в spring boot application?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Степан,
    Да, нужен и UserRequestDTO & UserResponseDTO.
    Вообще, лучше не отдавать на клиент всю структуру вашей БД. Для этих целей используется доп. прослойка Data To Object.
    Например, вам нужно вернуть список пользователей, но некоторые данные о пользователях хранимые в БД не нужны. В этом случае используется паттерн DTO.

    Для удобства работы с DTO (для маппинга) можно использовать ModelMapper || MapStruct. Ну или же интерфейс Converter<FROM, TO> самого спринга
  • Как в Spring правильно создавать и инжектить сервисы?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Степан,

    Но ведь не будет ошибкой такой вариант:

    Нет, это конечно же не ошибка. Другое дело, что в программировании есть различные принципы и паттерны, которых стараются придерживаться. В данном случае это GRASP
    https://habr.com/ru/post/92570/
    https://ru.wikipedia.org/wiki/GRASP

    А также собственно говоря, https://habr.com/ru/post/131993/

    Могли бы привести пример кода? Спасибо.

    1) это аннотация Primary
    https://www.baeldung.com/spring-primary
    Если у вас несколько имплементаций интерфейса, но при этом над одним из классов стоит аннотация Primary, то этот класс будет приоритетнее.
    @Component
    @Primary
    public class GeneralManager implements Manager {

    2) Аннотация Qualifier
    @Autowired
        @Qualifier("fooFormatter")
        private Formatter formatter;

    https://www.baeldung.com/spring-qualifier-annotation
    3) А также аннотации Resource & Inject
    https://www.baeldung.com/spring-annotations-resour...
  • Как правильно присвоить значение объекту в thymleaf?

    azerphoenix
    @azerphoenix Куратор тега Java
    федор unknown, Так, я глянул ваш проект.
    1) как я вижу в коде вы закомментировали отношение ManyToMany для Product & Category.

    2) Нет смысла в строке (сущ. Product)
    private String category;
    если у вас есть сущность Category

    3) В сущности Category
    @ManyToMany(mappedBy = "category")
    А должно быть:
    @ManyToMany(mappedBy = "categoryList")
    потому что в сущ. Product
    private List<Category> categoryList;

    4) Для таких полей, как private String description;
    лучше добавлять такую строку, как @Column(length=1000) Иначе по дефолту кол-во символов равно 255 и в случае, если описание больше, чем 255 символов, то получите исключение при попытке сохранить запись.

    5) Небольшой совет
    public Category get(Long id) {
            if (repository.findById(id).isPresent()){
                return repository.findById(id).get();
            }
            log.error("Категория не найдено");
            return null;
        }

    Чтобы такого не делать, лучше используйте Optional<Category>

    6) Еще один совет...
    private int price;
    int или long не подходит для хранения информации о стоимости. Вот, представьте, что если товар стоит 100 рублей 55 копеек. Это уже как минимум тип double или float.
    Гораздо правильнее использовать BigDecimal. Ну или на худой конец для учебного проекта подойдет - double.

    7) Чуть изменил ManyToMany
    Category
    @ManyToMany(mappedBy = "categoryList")
        private List<Product> productList;

    Product
    @ManyToMany(fetch = FetchType.LAZY, cascade = {
    			CascadeType.PERSIST,
    			CascadeType.MERGE
    	})
    	@JoinTable(name = "product_categories",
    				joinColumns = @JoinColumn(name = "product_id"),
    				inverseJoinColumns = @JoinColumn(name = "category_id"))
    	private List<Category> categoryList;


    8) Теперь, что касается вашего вопроса про категорию.

    Во-первых, в шаблоне вы некорректно выводите колонку категории
    <td th:text="${product.category}">Категория</td>
    По факту вы выводите private String category; вместо списка категорий. См. пункт 2 (это поле вообще не нужно). Вам нужно просто получить список категорий назначенных для данного товара, а затем при помощи th:each вывести названия этих категорий.
    Изменил эту колонку на:
    <td>
    				<span th:each="cat : ${product.categoryList}">
    					<span th:text="${cat.name}">Категория</span>&nbsp;
    				</span>
    				</td>


    9) Вот, что отправляется из фронта при сабмите формы:
    name=11&description=22&category=&price=300
    Как видите категория пустая. Пустая она потому, что:
    Также это поле в шаблоне new product лишнее <input type="text" th:field="*{category}"/> Зачем вам это поле, если есть select?

    10) Обратите внимание, что методы в интерфейсах по дефолту и так публичные.
    Соответственно, нет смысла писать модификатор доступа public
    public List<Category> search(String keyword);

    11) Обновил ProductRepository на
    @Query("SELECT p FROM Product p WHERE CONCAT(p.name, ' ', p.description, ' ', p.price) LIKE %?1%")
    	List<Product> search(String keyword);

    так как я в проекте удалил String category для Product.

    12) Вместо аннотации @RequestMapping можно использовать более специализированные. Например, GetMapping PostMapping PutMapping и т.д.

    13)
    th:value="${product.category}"
    Это не совсем верно. Вот, смотрите вы назначаете значению поля категория для нового товара - значение категории этого товара (которого не существует).

    14) Также в шаблоне new product обновил:
    <!-- Проблема! значение из option не происвается в product-->
    						<select th:field="*{categoryList}" class="form-select form-select-sm" aria-label="form-select-sm example" required>
    							<option selected value="">Выберите категорию</option>
    							<option th:each="category : ${categories}" th:value="${category.id}" th:text="${category.name}" value=""></option>
    						</select>


    Вот, результат с успешно добавленным товаром:
    DdLR1KS.png

    А вот, что убежало в бекэнд
    ji9bFMz.png

    Рекомендую прочитать вот, эту статью:
    https://vladmihalcea.com/the-best-way-to-use-the-m...

    Доп. полезная информация:
    https://stackoverflow.com/questions/50981616/thyme...
    https://www.baeldung.com/thymeleaf-list

    Вот, ваш проект с внесенными правками.
    https://github.com/hasanli-orkhan/demo
    Я не стал дорабатывать его, лишь указал на ваши ошибки и выше написал, как его можно улучшить
  • Как удалить всплывающее окно подтвердите действие на сайте?

    Said927, надеюсь, что получилось)
    Небольшой совет на будущее:
    старайтесь на всеможномных уровнях делать бекапы, чтобы при необходимости можно было бы восстановить сайт. Сам когда-то был начинающим разработчиком и тоже много чего приходилось исправлять. Неплохой плагин UpdraftPlus Backup, который позволяет создавать бекапы. А также можно копии сайта заливать в облако. Например, Google Drive или еще куда-нибудь. Уж поверьте мне делая бекапы вы облегчите свою жизнь.
    Желаю вам успехов)
  • Как удалить всплывающее окно подтвердите действие на сайте?

    Said927,
    теперь, найдите строку номер 1726.
    Увидите примерно такое:
    $(".wpcf7").on('wpcf7:mailsent', function(event){
    Строкой выше есть
    alert();
    Замените на
    //alert();
    или просто удалите.
    Сохраните и пробуйте заново