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

Java 将多个@queryParam映射到单个对象,java,rest,jakarta-ee,jackson,jax-rs,Java,Rest,Jakarta Ee,Jackson,Jax Rs,我有一个本地服务,我想通过我们的restful api访问它: @GET @Path("/some/path") OutputObject doSomeSpecialCalculation(@QueryParam("input") InputObject obj); 以下问题-最佳方法是什么: 为了能够创建InputObject,我需要很多不同的输入数据->constructor看起来像这样:newinputObject(obj1o1,obj2o2,…,obj6o6) Q1:是否可以将多个

我有一个本地服务,我想通过我们的restful api访问它:

@GET
@Path("/some/path")
OutputObject doSomeSpecialCalculation(@QueryParam("input") InputObject obj);
以下问题-最佳方法是什么:

  • 为了能够创建InputObject,我需要很多不同的输入数据->constructor看起来像这样:newinputObject(obj1o1,obj2o2,…,obj6o6)
Q1:是否可以将多个查询参数映射到单个对象中?

  • 下一个问题是,大多数参数(obj_n)需要一个特殊的ParamProvider进行构造。(例如,Obj2 o2的rest调用是一个id号,ParamConverter将id映射到正确的对象)
我可以创建一个新的本地服务方法,如下所示:

@GET
@Path("/some/path")
OutputObject doSomeSpecialCalculation(@QueryParam("obj1") Obj1 ob1, @QueryParam("obj2") Obj2 ob2, ...);
然后,我可以为每个对象创建多个ParamProviders,这样就可以了,但我不想在我们的localservices中创建重复的方法

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

TL;医生:

  • 我有一个本地服务方法,它将ComplexObject作为输入参数
  • 我想通过rest调用访问该方法
  • 要创建ComplexObject,我需要多个对象作为构造函数的参数
  • 大多数多个参数都需要一个特殊的映射器/转换器:Restful输入:id->Object
如果我能用注释来解决这个问题,那就太棒了:复杂对象上的@JsonTypeInfo,以及复杂对象构造函数的输入对象上的一些“使用该转换器”注释

问候,


(使用jackson 1.9/jboss eap 6.2)

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

这就是使用JSON的帖子的外观:

JSON:

爪哇:


嗨,刚刚研究过这个方法,看起来很不错。可能适用于具有复杂参数的GET请求。您是否也有一种Post方法(“someValue方法(ComplexObject obj)),其中ComplexObject作为json通过Post主体接收。目前,我正在使用MessageBodyWriter实现手工解析json,但如果我能提供一个映射器,将json转换为ComplexObject,那就更简洁了。如果ComplexObject将ComplexObject1用作成员变量,则映射程序将搜索ComplexObject1Sure的映射程序,请参见我的另一个答案。
{
    "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;
    }
}