我需要在PlayFramework中从Json创建对象。
Example example = Json.fromJson( request().body().asJson() , Example.class);
但我需要始终拥有对象中的所有值。
class Example{
@Required_from_Json public String name;
@Required_from_Json public boolen dead;
@Required_from_Json public Integer age;
.
.
50 more values
}
如果Json中的其中一个丢失,它仍会创建对象但值为null。如果json中缺少某些值或者对象是" null"我需要引起一些异常(可能是NullPointException)。并且愚蠢地分别检查每个属性(如年龄!= null)
你们有什么建议吗?
谢谢!
答案 0 :(得分:0)
这个问题与你的问题非常相似。它不是关于游戏,而是关于杰克逊:
https://jsfiddle.net/mrpf5ybq/
编辑:您可以自己创建简短的验证器:
for (Field f : obj.getClass().getFields()) {
f.setAccessible(true);
if (f.get(obj) == null) {
// Throw error or return "bad request" or whatever
}
}
此示例基于Configure Jackson to throw an exception when a field is missing
答案 1 :(得分:0)
由于您的JSON对象来自请求,您实际上可以使用Play的Form工具来处理您的情况。
在您的控制器方法中,您只需按以下方式调用它:
final Form<Example> form = Form.form(Example.class).bindFromRequest();
绑定请求中的数据。然后你可以检查是否有这样的错误:
if(from.hasErrors()) {
return badRequest(form.errorsAsJson());
}
并在没有错误的情况下从表单中检索对象
Example obj = form.get();
您的示例类还需要更改为使用Play的验证Contraints:
import play.data.validation.Constraints;
...
class Example{
@Constraints.Required public String name;
@Constraints.Required public boolean dead;
@Constraints.Required public Integer age;
.
.
50 more values
}
编辑:我应该注意,您的JSON对象属性名称和类属性变量名称必须相同才能使映射自动生效。
这种方式非常好,因为它返回的错误是特定于字段的,因此您可以将它们显示给用户,它将返回一个json对象(form.errorsAsJson()
)中所有字段的所有错误。您还可以使用Play提供的其他验证注释(例如@Contraints.Email
,@Constraints.MinLenth
等)。
注意这对我在Play 2.3.x
上有效。我没有使用任何最新版本的游戏,所以YMMV。