java jersey 2 如何使用 post 处理常规 html 表单数组?

java jersey 2 how to process regular html form array with post?

我有球衣端点

@Path(value = "/testfields")
@POST
@Consumes({"application/x-www-form-urlencoded"})
public Response acceptFields(@BeanParam MyWrapper    initialWrapper,String entity) {
  //.......

}

MyWrapper 是:

class MyWrapper{
    @FormParam("param1")
    private String param1;
    @FormParam("inners")
    private List<MyInnerWrapper> inners;

    //..getters setters
}

class MyInnerWrapper{
    @FormParam("innerParam1")
    private String innerParam1;

//.... getters setters


}

我有请求 POST 实体字符串:

param1=aaa&inners[0]["innerParam"]=bbb&inners[1]["innerParam"]=nnn

问题是我可以用@BeanParam注解获取父字段param1,但是我无法获取自定义classes的内部列表,为什么?如何处理常规 html 表单数组?我需要在端点中使用其内部 class 对我的 class 进行评估。我尝试了数组、对象列表,但没有任何效果。谢谢

据我所知,泽西岛不支持这种语法。如果要为 @FormParam 使用自定义类型,则至少需要满足 Javadoc 中列出的一种要求。一种选择是只使用带有 String 参数的构造函数。例如

public class MyInnerWrapper {

    private final String innerParam;

    public MyInnerWrapper(String param) {
        this.innerParam = param;
    }

    public String getInnerParam() {
        return innerParam;
    }
}

那么您需要做的就是发送这个请求

param1=blahparam&inners=first&inners=second&inners=third

那你可以

@FormParam("inners")
private List<MyInnerWrapper> inners;

不需要 [] 来指定索引。允许重复。这就是为什么我们可以使用 @FormParam 类型的列表和数组。

现在,如果您想拥有多个 属性,然后尝试像现在这样映射它们,我认为这行不通。至少在泽西岛没有。如果您需要更复杂的类型,我建议您考虑使用 JSON。否则就坚持使用简单的键。