我有一個 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
提交
取消