Как подключить пакеты OSGI (Отправить сущность через пакеты)? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть служба REST, которая содержит три класса в одном модуле (комплект) User.java -> Entity UserService.java -> Служба REST UserValidation.java -> Специальный валидатор для сущности.Сервер отправляет объект в этот валидатор и получает результат валидации (true или false):

User.java

@XmlRootElement(name = "User")
public class User {
    private long id;
    private String name;
    private String surname;
    private String patronymic;

    /*Getters and Setters*/
}

UserService.java

public class UserServiceImpl implements UserService {

    private UserDAO userDbDao = new UserDatabaseDAO();

    @POST
    @Path("/users/")
    public Response addUser(User user) {
        UserValidator userValidator = new UserValidator(user);
        if (userValidator.isValid()) {
            User newUser = userDbDao.createUser(user);
            return Response.ok().type("application/xml").entity(newUser).build();
        } else {
            return Response.status(Response.Status.BAD_REQUEST).entity(userValidator.getErrorMessage()).build();
        }
    }
}

UserValidator.java

public class UserValidator {
    private static final int MAX_SIZE_NAME = 50;
    private static final int MIN_SIZE_NAME = 2;
    private User user;

    public UserValidator(User user) {
        this.user = user;
    }

    private BadUserResponse badUserResponse = new BadUserResponse();

    private boolean isNameValid(String name) {
        if (name == null) {
            badUserResponse.setNsp("Null in fields name/surname/patronymic");
            return false;
        }
        String tempName = name.trim();
        if (tempName.length() < MIN_SIZE_NAME || tempName.length() > MAX_SIZE_NAME) {
            badUserResponse.setNsp(String.format("Fields name/surname/patronymic too long or too short (Allowed length from %d to %d)", MIN_SIZE_NAME, MAX_SIZE_NAME));
            return false;
        }
        for (int i = 0; i < tempName.length(); i++) {
            if (!Character.isLetter(tempName.charAt(i))) {
                badUserResponse.setNsp("Fields name/surname/patronymic contains wrong symbols (Only letters allowed)");
                return false;
            }
        }
        return true;
    }
    public boolean isValid() {
        return (isNameValid(user.getName()) &
                isNameValid(user.getSurname()) &
                isNameValid(user.getPatronymic()));
    }

    public BadUserResponse getErrorMessage() {
        return badUserResponse;
    }

BadUserResponse.java

@XmlRootElement(name="baduserresponce")
public class BadUserResponse {
    private String nsp;

    public String getNsp() {
        return nsp;
    }

    public void setNsp(String nsp) {
        this.nsp = nsp;
    }
}

Но теперь мне нужно разделить это на отдельные пакеты.Потому что, как вы видите, они используют функциональность друг друга.Например UserService.java только что использовал это UserValidator userValidator = new UserValidator(user);

Мне нужно как-то подключить эти пакеты (OSGI Service, ActiveMQ).

На мой взгляд, это работает что-то вродеэто:

  1. Пакет UserService получает сущность User из метода REST.
  2. Поместите все поля пользователя (имя, фамилия, отчество) в очередь ActiveMQ (так как пакет UserValidator не знаетчто такое сущность пользователя).
  3. Пакет UserValidator получает поля пользователя из очереди и проверяет их.
  4. Пакет UserValidator помещает результат проверки (true / false) в очередь.
  5. Пакет UserServiceполучить результат проверки из очереди и отправить пользователя в DAO.

Но это всего лишь концепция.Я не прав?

Какой лучший способ передать сущность через связки и как мне это сделать?

1 Ответ

1 голос
/ 16 мая 2019

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

Другие варианты могут иметь смысл разъединить ваши пакеты.Использование обмена сообщениями позволяет избежать синхронизации звонков.Его также можно использовать для отправки данных на удаленный компьютер.JMS сообщения довольно тяжелый вес, хотя.Вам нужен брокер и зависит от API.В вашем случае вам также напрямую необходим результат проверки.Таким образом, вы будете имитировать вызов синхронизации с JMS.Поэтому я бы предпочел этого избежать.

Использование службы OSGi позволяет отделить реализацию службы.В этом случае имеет смысл создать интерфейс для UserValidator.Я бы тоже поместил этот интерфейс в отдельный комплект.Затем вам нужно зарегистрировать сервис в пакете, который реализует валидатор, и связать сервис в пакете, который использует валидатор.Сервисы OSGi очень легкие и синхронные по умолчанию.Поэтому я думаю, что они хорошо подошли бы к вашей проблеме.Для регистрации и привязки сервисов не используйте API OSGi напрямую.Вместо этого используйте декларативные услуги с аннотациями.Они устраняют большую часть сложности при работе с сервисами OSGi.

Кстати.Я не уверен, как вы делаете отдых.Предлагаю взглянуть на доску Aries JAX-RS.

...