将多个@queryParam 映射到单个对象
Mapping of multiple @queryParam into a single object
我有一个本地服务,我想通过我们的 restful api:
访问
@GET
@Path("/some/path")
OutputObject doSomeSpecialCalculation(@QueryParam("input") InputObject obj);
以下 problem/problems - 最好的方法是什么:
- 为了能够创建 InputObject,我需要很多不同的输入数据 -> consturctor 看起来像这样: 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 创建多个 ParamProvider 并且它会工作,但我不想在我们的本地服务中创建重复的方法。
问题 2:对于我的特定问题,是否有更好的解决方案?
TL;DR:
- 我有一个将 ComplexObject 作为输入参数的本地服务方法
- 我想通过 rest 调用访问该方法
- 要创建那个 ComplexObject,我需要多个对象作为构造函数的参数
- 大部分的多个参数需要一个特殊的mapper/converter: Restful-Input: id -> Object
如果我可以仅使用注解解决这个问题,那就太棒了:复杂对象上的@JsonTypeInfo,以及复杂对象构造函数的输入对象上的一些 "use-that-converter"-注解。
此致,
(使用杰克逊 1.9/jboss eap 6.2)
在 Endpoint 的方法参数(您的自定义 class)上使用 @BeanParam 注释,并在自定义字段上使用所有需要的 @QueryParam、@Header 等值 class.
这就是 POST 和 JSON 的样子:
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;
}
}
我有一个本地服务,我想通过我们的 restful api:
访问@GET
@Path("/some/path")
OutputObject doSomeSpecialCalculation(@QueryParam("input") InputObject obj);
以下 problem/problems - 最好的方法是什么:
- 为了能够创建 InputObject,我需要很多不同的输入数据 -> consturctor 看起来像这样: 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 创建多个 ParamProvider 并且它会工作,但我不想在我们的本地服务中创建重复的方法。
问题 2:对于我的特定问题,是否有更好的解决方案?
TL;DR:
- 我有一个将 ComplexObject 作为输入参数的本地服务方法
- 我想通过 rest 调用访问该方法
- 要创建那个 ComplexObject,我需要多个对象作为构造函数的参数
- 大部分的多个参数需要一个特殊的mapper/converter: Restful-Input: id -> Object
如果我可以仅使用注解解决这个问题,那就太棒了:复杂对象上的@JsonTypeInfo,以及复杂对象构造函数的输入对象上的一些 "use-that-converter"-注解。
此致,
(使用杰克逊 1.9/jboss eap 6.2)
在 Endpoint 的方法参数(您的自定义 class)上使用 @BeanParam 注释,并在自定义字段上使用所有需要的 @QueryParam、@Header 等值 class.
这就是 POST 和 JSON 的样子:
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;
}
}