我正在编写一个简单的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
的多个引用,尽管将其添加到字段中并没有什么不同。
现代杰克逊版本具有@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