如何连接 OSGI 包(通过包发送实体)?

我有一个 REST 服务,它在一个模块(包)中包含三个类 User.java -> Entity UserService.java -> REST 服务 UserValidation.java -> 实体的特殊验证器。服务器将实体发送到此验证器并获得验证结果(真或假):


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;

    }


但是现在,我需要将其拆分成单独的包。因为,如您所见,它们使用彼此的功能。例如UserService.java 就使用了这个UserValidator userValidator = new UserValidator(user);


我需要以某种方式连接这些包(OSGI 服务、ActiveMQ)。


在我看来,它的工作原理是这样的:

  1. UserService 包从 REST 方法获取用户实体。

  2. 将所有用户字段(姓名、姓氏、父名)放入 ActiveMQ 队列(因为 UserValidator 包不知道用户实体是什么)。

  3. UserValidator 包从队列中获取用户的字段并验证它们。

  4. UserValidator 包将验证结果(真/假)放入队列。

  5. UserService 包从队列中获取验证结果并将用户发送到 DAO。

但这只是一个概念。我错了吗?

通过捆绑包传递实体的最佳方式是什么?我应该怎么做?


浮云间
浏览 104回答 1
1回答

九州编程

您目前通过 new 简单地启动 UserValidator 的方法在技术上很好,即使它们存在于不同的包中。如果你的验证器只在这个地方需要并且很简单,我什至会把它放在同一个包中。其他选项对于解耦您的捆绑包很有意义。使用消息传递可以避免同步调用。它还可以用于将数据发送到远程机器。JMS 消息传递是相当重量级的。您需要一个代理并依赖于 API。在您的情况下,您还直接需要验证结果。因此,您将使用 JMS 模拟同步调用。所以我宁愿避免这种情况。使用 OSGi 服务允许您与服务的实现分离。在这种情况下,为 UserValidator 创建一个接口是有意义的。我还会将此接口放入一个单独的包中。然后,您需要在实现验证器的包中注册服务,并在使用验证器的包中绑定服务。OSGi 服务的重量非常轻,默认情况下是同步的。所以我认为它们很适合你的问题。对于注册和绑定服务,不要直接使用 OSGi API。而是使用带有注释的声明式服务。它们消除了处理 OSGi 服务的大部分复杂性。顺便提一句。我不确定你是怎么做 REST 的。我建议看看 Aries JAX-RS Whiteboard。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java