Jersey - 防止基于QueryParam的JavaBean映射

时间:2017-03-27 11:03:56

标签: 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) {
    this(id, name, uri);
    this.stages = stages;
}

有时我需要在没有阶段的情况下使用其他阶段获得Rounds,所以我使用两种不同的@GET方法创建了 @QueryParam

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Round> getRounds(@QueryParam("withStages") boolean withStages){
    if(withStages){
        return roundService.getRoundsWithStages();
    }else{
        return roundService.getRounds();
    }
}

如果我需要有阶段的轮次,我会打电话:

/rounds?withStages=true

我得到这样的东西:

[
  {
    "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

如果没有舞台我打电话:

/rounds?withStages=false

我得到这样的东西:

[
  {
    "id": 1,
    "name": "First Round",
    "stages": [],
    "uri": "firstround"
  },
  {
    "id": 2,
    "name": "Round of 16",
    "stages": [],
    "uri": "roundof16"
  }
  //and so on

你可以看到我什么时候打电话给?withStages = false 我会得到一些空的阶段,但是,我根本不想获得它。我该怎么办?

请注意,如果我在圆形课程的阶段的getter上设置 @XmlTransient ,我将无法获得第一个选项中的阶段?withStages =真

我认为一种可能的解决方案是为圆形创建和扩展类,并添加到它的阶段。但是,有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

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

public class Round{
     @JsonInclude(value=Include.NON_NULL)
     List<Stage> stages
}

上述规则指定仅当stages不为空时才应存在阶段。有了上述规则,您必须确保将withStages=falsestages设置为null并且当withStages = true时,stage不为null。 @JsonInclude中有更多选项,例如Include.NON_EMPTY也可以尝试。

答案 1 :(得分:0)

问题是因为我有,

public Round {
    ...
    private List<Stage> stages = new ArrayList<>();
    ...
}

我更正了:

public Round {
    ...
    private List<Stage> stages;
    ...
}

它运作正常。