Передача данных между несколькими приложениями в Java

У меня есть проект, который был начат и организован кем-то ооооооооооооооооооооооочень талантливо, чем я, и я наткнулся на момент, когда не могу понять, как с ним совладать.

Это проект Java/JavaFX/Spring Boot, а НЕ проект Swing. Я вижу много ответов относительно: Swing. Оба приложения также настроены в Gradle, поэтому оба приложения имеют свои собственные отдельные ./gradlew bootRun команды и работают в CentOS 7. Оба приложения имеют свои собственные, отдельные main() methods. Я считаю, что первоначальный дизайн был намеренно предназначен для полного удаления любого доступа к данным из графического интерфейса, что и является причиной разделения. Мне просто трудно найти способ передавать данные нужно туда и обратно.

Есть отдельные приложения, предназначенные для совместной работы. **Kiosk** в котором находятся элементы графического интерфейса и контроллеры, связанные с графическим интерфейсом. **Governor** в котором находятся API и приложение APP. На данный момент API помогает с интерфейсами Source и File. Приложение содержит базу данных H2 (все они хранятся в файлах JSON, но содержимое не имеет отношения к этому конкретному вопросу), пользовательский пакет (в котором хранятся пользовательские данные, которые загружаются в базу данных H2) и исходный пакет (в котором хранятся все файлы). методы)

Что я хочу сделать, так это:

  • Получите username и password, предоставленные пользователем на уровне **Kiosk**, и каким-то образом передайте их в **Governor**.
  • Как только я могу передать данные, я знаю, как сделать все остальное, чтобы проверить базу данных и проверить, есть ли у пользователя действительные учетные данные или нет, и т. д.
  • Как только у меня будет логическое значение (давайте назовем id validUser), я хочу передать эту информацию обратно из **Governor** в **Kiosk**, и я могу двигаться дальше.

У меня нет кода для копирования и вставки, поэтому я надеюсь, что приведенного выше описания достаточно, чтобы указать мне правильное направление. Я пробовал искать в Google «передавать данные между отдельными Java-приложениями», «отдельное графическое и логическое Java-приложение» и все, что вы можете придумать, но я наткнулся на стену.

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

*** Редактировать *** Пытаюсь добавить MVP, насколько это возможно. Надеюсь, все, что нужно для ответа на вопрос выше, можно почерпнуть снизу.

Киоск/логинконтроллер

@Component
public class LoginController extends Controller {
    @FXML
    TextField username;

    @FXML
    TextField password;

    @FXML
    Button loginButton;

    @FXML
    public void tryLogin() {
        UserServices userServices = new UserServices();
        String usernameEntered = username.textProperty().getValue();
        String passwordEntered = password.textProperty().getValue();
        userServices.validateUser(usernameEntered, passwordEntered);
        // ... other non-related methods re: tryLogin()
    }
}

Киоск/UserServices

public class UserServices {
    public boolean validateUser(String username, String password) {
        // **** How do I pass the args (username and password) to Governor?
        if (!userFound) {
            return false; // user not found, deny entry
        }
        return true; // allow entry
        }
    }
}

Губернатор/API/FileEntry

Примечание: Этот файл является лишь образцом API-модуля, взаимодействующего с KIOSK — я не понимаю этого полностью — опять же, я делаю все возможное с моими ограниченными ресурсами; I полагать Мне нужно создать собственный пользовательский модуль API, но я не знаю, как это сделать)

@JsonDeserialize(as = DefaultFileEntry.class)
public interface FileEntry {
    Path getPath();
    boolean isDirectory();

    @JsonIgnore
    default Optional<String> getName() {
        if (getPath().getFileName() == null) {
            return Optional.empty();
        } else {
            return Optional.of(getPath().getFileName().toString());
        }
    }
}

Губернатор/приложение/UserRepository

public interface UserRepository extends JpaRespository<User, String> {
    User findByUsername(String username);
}

Губернатор/приложение/UserService

@Service
public class UserService {
    private UserRepository userRepository;
    
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // SQL methods to create database, if necessary, search, create, update, and delete users
}

Они на самом деле отдельные Приложения? Каждый со своим методом main(...) и запущен независимо на отдельных JVM? Это то, что вы действительно имеете в виду? В любом случае: "У меня нет кода для вставки". Затем создайте некоторые. Напишите новый проект с нуля (минимальный воспроизводимый пример), который демонстрирует проблему (и ничего больше). Все, что вам нужно сделать, это сымитировать ту же проблему, передав простое значение таким же образом.

James_D 03.05.2022 17:26

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

jewelsea 03.05.2022 19:09

@James_D Похоже, вы начинаете понимать. Я не могу вдаваться в подробности, но я не работаю на «компанию», так сказать, и мои начальники, хотя и гениальны по-своему, не могут предложить помощь из-за отсутствия у них собственного опыта. Но без другого старшего разработчика, который мог бы ответить на вопросы и получить его руководство / видение для этого переписывания (которое я завершал небольшими кусками и очень помог, чтобы кто-то критиковал), я должен прибегнуть к другим средствам, чтобы помочь мне. понимать. Я изучил Spring, Java, JavaFX и т. д. Но это сценарий широты и глубины, и я тону в широте.

Will Dutcher 03.05.2022 19:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует несколько способов обмена данными между приложениями:

  1. JMS, AMQ или какая-либо другая система обмена сообщениями.
  2. Общая база данных, в которой приложения опрашивают изменения.
  3. Откройте конечную точку REST, которую каждое приложение может вызывать для обновления друг друга. Обязательно защитите с помощью сертификатов, чтобы посторонние не могли их использовать.

Это больше похоже на комментарий, чем на реальный ответ. (В нынешнем виде на этот вопрос, похоже, нет ответа.)

James_D 03.05.2022 18:30

@Ryan Вот некоторые вещи, которые я абсолютно точно могу найти. Я знаю, для меня большая часть моей проблемы, помимо того, что я очень зеленый, заключается в том, что я не знаю, чего я не знаю. В частности, я ничего не знаю о том, что такое JMS или AMQ, и никогда не использовал их, а тем более не знаю об их существовании. Я на 100% за изучение новых вещей и их применение, но если я о них не знаю, я ничего не могу с этим поделать. Одного наличия акронимов достаточно, чтобы поставить меня на еще один квест Google, так что спасибо вам за это! Я не знаю, можем ли мы использовать системы обмена сообщениями из-за определенных ограничений там, где я работаю, но я проверю.

Will Dutcher 03.05.2022 18:49

@James_D, потому что это комментарий. Этот вопрос чрезвычайно широк, и однозначного ответа на него нет. Правильное решение может быть определено только людьми, поддерживающими код и среду развертывания.

Ryan 03.05.2022 19:12

Хорошо, но если это комментарий, опубликуйте комментарий, а не ответ.

James_D 03.05.2022 19:13

@WillDutcher JMS (система обмена сообщениями Java) — очень старая система для передачи сообщений. AMQ — это проект Apache activemq.apache.org. Это очень надежная система для передачи сообщений между системой, как внутренней, так и внешней.

Ryan 03.05.2022 19:15

@James_D Я опубликовал ответ, достаточно широкий, чтобы соответствовать вопросу и дать направление ОП.

Ryan 03.05.2022 19:16

Другие вопросы по теме