0

我正在编写一个简单的 REST 服务,它需要一个包含 Json 的 POST。该服务应该拒绝任何不包含它所期望的密钥的 Json。我在 JBoss EAP 7.1 上使用 JAX-RS,但无法做到这一点。代码示例:

import javax.ejb.Stateless;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/")
@Stateless
@Produces("text/plain")
public class TestAccess
{
  @POST
  @Path("test/")
  @Consumes(MediaType.APPLICATION_JSON)
  public String consumeJson(TestClass c)
  {
    return c.toString();
  }

}
public class TestClass
{
  public String first;
  public String second;

  public String toString()
  {
    return (first + ", " + second);
  }
}

以前我写consumeJson期望期望 aJsonObject并使用 Jackson 解析它ObjectMapper。这样做会导致在接收 Json 缺失键时出错。我认为我现在这样做的方式是一种“更清洁”的方式,因为现在参数列表清楚地显示了 Json 应该描述的对象类型。但是,我不想首先检查方法中的每个字段,也不想向isValid()以这种方式获得的每个对象添加方法。

该示例{"first" : "contentOfFirst"}返回"contentOfFirst, null"而不是失败。

编辑:为了澄清,我尝试了这样的事情:

import javax.validation.constraints.NotNull;

public class TestClass
{
  @NotNull
  public String first;
  @NotNull
  public String second;

  public String toString()
  {
    return (first + ", " + second);
  }
}

这并没有改变结果,而不是失败(如预期的那样) POST 仍然得到了 response "contentOfFirst, null"。我知道这些注释仍然需要一个验证器来验证它们。我(错误地?)认为 Jboss 提供了这样一个验证器。

4

2 回答 2

1

结果我错过了您需要另一个注释来执行检查:

  @POST
  @Path("test/")
  @Consumes(MediaType.APPLICATION_JSON)
  public String consumeJson(@Valid TestClass c)
  {
    return c.toString();
  }

这就是 JBoss 实际执行检查所需的全部内容。

需要注意的是,JBoss 不喜欢在同一个参数列表中使用@Valid和泛型类(如)。List<PathSegment>

于 2020-01-21T14:51:58.770 回答
0

现代杰克逊版本有 @JsonCreator 和 @JsonProperty 在反序列化期间进行一些验证,例如对于您的情况:

public class TestClass
{
    @JsonCreator
    TestClass(
            @JsonProperty(value = "first", required = true) Integer first,
            @JsonProperty(value = "second", required = true) Integer second) {
        this.first = first;
        this.second= second;
    }
    public String first;
    public String second;

    public String toString()
    {
        return (first + ", " + second);
    }
}

更强大的解决方案是使用Bean Validation

于 2020-01-21T11:32:36.210 回答