【问题标题】:Mapping of multiple @queryParam into a single object将多个 @queryParam 映射到单个对象
【发布时间】:2015-01-19 09:28:31
【问题描述】:

我有一个 localService,我想通过我们的 restful api 访问它:

@GET
@Path("/some/path")
OutputObject doSomeSpecialCalculation(@QueryParam("input") InputObject obj);

以下问题/问题 - 最好的方法是什么:

  • 为了能够创建 InputObject,我需要很多不同的输入数据 -> 构造函数看起来像这样:new InputObject(Obj1 o1, Obj2 o2, ..., Obj6 o6);

Q1:是否可以将多个 queryParam 映射到一个对象中?

  • 接下来的问题是大部分参数(obj_n)都需要一个特殊的ParamProvider来构造。 (例如,Obj2 o2 的其余调用是一个 id 号,ParamConverter 将 id 映射到正确的对象)

我可以像这样创建一个新的本地服务方法:

@GET
@Path("/some/path")
OutputObject doSomeSpecialCalculation(@QueryParam("obj1") Obj1 ob1, @QueryParam("obj2") Obj2 ob2, ...);

然后我可以为每个 obj_n 创建多个 ParamProviders,它会工作,但我不想在我们的本地服务中创建重复的方法。

Q2:对于我的特定问题是否有更好的解决方案?

TL;DR:

  • 我有一个将 ComplexObject 作为输入参数的本地服务方法
  • 我想通过 rest 调用访问该方法
  • 要创建 ComplexObject,我需要多个对象作为构造函数的参数
  • 大多数参数需要一个特殊的映射器/转换器:Restful-Input: id -> Object

如果我可以仅使用注释来解决这个问题,那就太棒了:复杂对象上的@JsonTypeInfo,以及复杂对象构造函数的输入对象上的一些“use-that-c​​onverter”注释。

问候,

(使用杰克逊 1.9/jboss eap 6.2)

【问题讨论】:

    标签: java rest jakarta-ee jackson jax-rs


    【解决方案1】:

    在端点的方法参数(您的自定义类)上使用@BeanParam 注释,并在自定义类的字段上使用所有需要的@QueryParam、@Header 等值。

    这就是带有 JSON 的 POST 的样子:

    JSON:

    {
        "user_name" : "Chewbacca",
        "year_of_birth" : 1977
    }
    

    Java:

    import com.fasterxml.jackson.annotation.JsonCreator;
    import com.fasterxml.jackson.annotation.JsonProperty;
    
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
    
    public class SimpleRequest {
    
        @NotNull
        private final String userName;
    
        @Min(1900)
        private final int yearOfBirth;
    
        @JsonCreator
        public SimpleRequest(@JsonProperty("user_name") String userName,
                             @JsonProperty("year_of_birth") int yearOfBirth) {
            this.userName = userName;
            this.yearOfBirth = yearOfBirth;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public int getYearOfBirth() {
            return yearOfBirth;
        }
    }
    

    【讨论】:

    • 您好,刚刚研究了这种方法,看起来还不错。可以处理带有复杂参数的 GET 请求。您是否还有一种 Post 方法('someValue 方法(ComplexObject obj)),其中 ComplexObject 通过发布的正文作为 json 接收。目前我正在使用 MessageBodyWriter 实现手动解析 json,但如果我可以提供一个可以将 json 转换为 ComplexObject 的映射器,它会更清晰。如果 ComplexObject 将 ComplexObject1 用作成员变量,则映射器将搜索 ComplexObject1 的映射器
    • 当然,看我的其他答案。
    猜你喜欢
    • 2019-02-06
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多