Jersey-防止基于QueryParam的JavaBean映射

Jersey-防止基于QueryParam的JavaBean映射,java,web-services,rest,jersey,jax-rs,Java,Web Services,Rest,Jersey,Jax Rs,我有一个名为Round的Java类,其中包含以下构造函数 public Round(){} public Round(int id, String name, String uri) { super(); this.id = id; this.name = name; this.uri = uri; } public Round(int id, String name, String uri, List<Stage> stages) {

我有一个名为Round的Java类,其中包含以下构造函数

public Round(){}

public Round(int id, String name, String uri) {
    super();
    this.id = id;
    this.name = name;
    this.uri = uri;
}   

public Round(int id, String name, String uri, List<Stage> stages) {
    this(id, name, uri);
    this.stages = stages;
}
我得到了这样的结果:

[
  {
    "id": 1,
    "name": "First Round",
    "stages": [
      {
        "id": 1,
        "name": "Stage 1",
        "uri": "stage1"
      },
      {
        "id": 2,
        "name": "Stage 2",
        "uri": "stage2"
      }
    ],
    "uri": "firstround"
   }
   //and so on
[
  {
    "id": 1,
    "name": "First Round",
    "stages": [],
    "uri": "firstround"
  },
  {
    "id": 2,
    "name": "Round of 16",
    "stages": [],
    "uri": "roundof16"
  }
  //and so on
如果没有阶段,我呼叫:

/rounds?withStages=false
我得到这样的东西:

[
  {
    "id": 1,
    "name": "First Round",
    "stages": [
      {
        "id": 1,
        "name": "Stage 1",
        "uri": "stage1"
      },
      {
        "id": 2,
        "name": "Stage 2",
        "uri": "stage2"
      }
    ],
    "uri": "firstround"
   }
   //and so on
[
  {
    "id": 1,
    "name": "First Round",
    "stages": [],
    "uri": "firstround"
  },
  {
    "id": 2,
    "name": "Round of 16",
    "stages": [],
    "uri": "roundof16"
  }
  //and so on
你可以看到,当我调用?with stages=false时,我得到了空的stage数组,但是,我根本不想得到它。我能做什么

请注意,如果我在round类中阶段的getter上设置了@xmltransive,我将无法获得第一个选项?with stages=true中的阶段


我认为一个可能的解决方案是为round创建和扩展类,并在其中添加阶段。但是,有更好的解决方案吗?

如果使用Jackson进行序列化,可以使用
@JsonInclude
注释来指定何时包含某些字段。因此,在您的情况下,当
with stages=false时,您需要隐藏
阶段
。这可以通过使用
@JsonInclude
实现,如下所示

public class Round{
     @JsonInclude(value=Include.NON_NULL)
     List<Stage> stages
}
公开课轮{
@JsonInclude(值=Include.NON_NULL)
列出阶段
}

上述规则规定,只有当
stages
不为空时,才应显示stages。有了上述规则,您必须确保当
withStages=false
时,
stages
设置为null,当withStages=true时,stages不为null。
@JsonInclude
中有更多选项,如
Include.NON_EMPTY
,也可以尝试。

问题是因为我

public Round {
    ...
    private List<Stage> stages = new ArrayList<>();
    ...
}
公开回合{
...
私有列表阶段=新建ArrayList();
...
}
我更正为:

public Round {
    ...
    private List<Stage> stages;
    ...
}
公开回合{
...
私人名单阶段;
...
}

它工作正常。

您使用Jackson生成JSON吗?我使用Jersey jax rsI不知道如何将Jersey与Jackson一起使用,我添加了Jersey JSON依赖项,但没有出现@JsonInclude注释。您是如何添加Jersey JSON依赖项的?如果使用maven,Json依赖项被添加为
谢谢,我解决了这个问题。我弄错了,请检查我的答案。(如果您想删除您的答案,Jersey可以在默认情况下省略空值,而无需使用Jackson。