java - 当 REST 端点有太多可选参数时,如何使用参数对象而不是多个参数

标签 java angularjs rest query-string

我有一个 REST 端点,如下所示。

@Path("/api/observers")
public interface MyServiceEndpoint {

    @GET
    @Path("/history")
    HistoryPage<Action> getObserverHistory(@QueryParam("pageNum") @DefaultValue("1") int pageNum,
                                           @QueryParam("pageSize") @DefaultValue("25") int pageSize,
                                           @QueryParam("methodName") String methodName,
                                           @QueryParam("dateBefore") String dateBefore,
                                           @QueryParam("dateAfter") String dateAfter,
                                           @QueryParam("actionUUID") String actionUUID,
                                           @QueryParam("supersededByUUID") String supersededByUUID,
                                           @QueryParam("eventUUID") String eventUUID,
                                           @QueryParam("wasSuccessful") Boolean wasSuccessful);

}

如您所见,有很多参数,其中一些是可选的。 有人告诉我,更好的设计模式是使用参数对象而不是指定这几个参数。 我是 REST 新手,我不知道这意味着什么以及如何做到这一点。
我还想知道一旦完成,如何从 AngularJS 服务中使用它?现在我正在使用这个现有端点,例如:

myService.toggleEnabled = function (observer) {
            return $http({
                method: 'PUT',
                url: 'api/observers/history',
                headers: {
                    'Accept': mimeType,
                    'Content-Type': mimeType
                },
                params : {
                    pageNum: 1,
                    pageSize: 5
                }
            });
        };

有人可以给我举个例子或者给我指出正确的方向/资源吗?

最佳答案

自 JAX-RS 2.0 起,引入了 @BeanParam 作为参数聚合器。您只需定义简单的 POJO 类,并将所有查询参数作为字段:

public class ObserverHistoryParams {
    @QueryParam("pageNum") @DefaultValue("1") 
    private int pageNum;

    @QueryParam("pageSize") @DefaultValue("25") 
    private int pageSize;

    // other params & getters & setters
}

然后将 getObserverHistory 方法签名更改为:

HistoryPage<Action> getObserverHistory(@BeanParam ObserverHistoryParams params) {
  ...
}

使用这种方法,您的 Angular 前端界面不需要任何更改。

关于java - 当 REST 端点有太多可选参数时,如何使用参数对象而不是多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41556167/

相关文章:

java - 无法使用 Cucumber + Selenium Webdriver + Chrome + Capybara 测试远程 HTML/CSS/JS/Java 网站

angularjs - 如何找到 Ionic 1 项目中使用的 ui-router 版本?

javascript - 如何隐藏 Angular 网站等功能的源代码?

java - 忽略 CSV 和 JSON 中的不同字段

rest - 禁止加载嵌入式 servlet

java - 测试失败时 Rest Assured Exception

java - 使用 Java 和 Nashorn 编写脚本的新手,有教程吗?

java - 要使用的 Hibernate 或 JPA 注释

java - 使 IntelliJ 生成测试而不抛出异常

javascript - 使用 ngAudio 时出现 AngularJS 错误