在JAX-RS中使用Json:禁止空值

问题描述 投票:0回答:1

我正在编写一个简单的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以期望得到JsonObject并使用Jackson ObjectMapper进行了解析。收到Json丢失的密钥时,这样做会导致错误。我认为我现在做的方式是一种“更干净”的方式,因为现在参数列表清楚地显示了Json应该描述哪种对象。但是,我不想检查方法中每个字段的第一件事,也不想向以此方式获得的每个对象添加isValid()方法。

示例{"first" : "contentOfFirst"}返回"contentOfFirst, null"而不是失败。我看到了对@NotNull的多个引用,尽管将其添加到字段中并没有什么不同。

java jboss jax-rs jboss7.x java-ee-8
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.