将多个@queryParam映射到单个对象

时间:2015-01-19 09:28:31

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

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

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

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

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

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

  • 下一个问题是大多数参数(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作为输入参数
  • 我想通过休息电话访问该方法
  • 要创建ComplexObject,我需要多个对象作为构造函数的参数
  • 大多数参数需要一个特殊的映射器/转换器:Restful-Input:id - >对象

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

此致

(使用jackson 1.9 / jboss eap 6.2)

1 个答案:

答案 0 :(得分:1)

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

这就是使用JSON的POST的样子:

JSON:

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

爪哇:

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;
    }
}