我有一个 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.javapublic 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.javapublic 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)。在我看来,它的工作原理是这样的:UserService 包从 REST 方法获取用户实体。将所有用户字段(姓名、姓氏、父名)放入 ActiveMQ 队列(因为 UserValidator 包不知道用户实体是什么)。UserValidator 包从队列中获取用户的字段并验证它们。UserValidator 包将验证结果(真/假)放入队列。UserService 包从队列中获取验证结果并将用户发送到 DAO。但这只是一个概念。我错了吗?通过捆绑包传递实体的最佳方式是什么?我应该怎么做?
1 回答

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