我使用JSON-B开发了一个Java REST服务,将传入的有效负载映射到POJO。
现在我要做的是验证传入的有效负载,可能是针对JSON模式,但到目前为止我还没有找到任何意义上的任何内容......
是否可以覆盖默认的JSON-B映射过程,从而捕获任何映射异常并自行处理它?</ p>
答案 0 :(得分:1)
要实现此目的,您可以注册自己的JAX-RS提供程序,该提供程序执行JSON(反)序列化并在那里处理任何错误。
例如:
@Consumes({ "*/*" })
@Provider
public class JsonBProvider implements MessageBodyReader<Object> {
private static final Jsonb jsonb = JsonbBuilder.create();
@Override
public boolean isReadable(Class<?> type, Type genericType,
Annotation[] annotations,
MediaType mediaType) {
return true;
}
@Override
public Object readFrom(Class<Object> clazz, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, String> httpHeaders,
InputStream entityStream)
throws IOException, WebApplicationException {
try {
return this.jsonb.fromJson(entityStream, clazz);
} catch (Exception e) {
// Do your custom handling here
}
}
}
这将覆盖通过JAX-RS和JSON-B进行的反序列化。
注意:如果您也想对序列化执行相同的操作,则可以类似的方式实现MessageBodyWriter<Object>
。
答案 1 :(得分:0)
验证和反序列化是不同的关注点,因此只有在确实需要时,我才会将它们联系在一起如果您确实必须使用JSON模式。但是,如果您可以自由选择声明约束的方式,那么我建议您进行bean验证,例如这样的JAX-RS资源(请注意@Valid
注释):
@Path("ping")
public class PingBoundary {
@POST
public String ping(@NotNull @Valid Person addressee) {
return "Hi " + addressee.getName() + "!";
}
}
还有一个有效载荷类(使用lombok @Data annotation):
@Data
public class Person {
private String name;
@Min(0)
private short age;
}
传递无效的age
到-2会给您400 Bad Request
并提供有用的响应正文:
{
"classViolations": [],
"exception": null,
"fieldViolations": [],
"parameterViolations": [
{
"constraintType": "PARAMETER",
"message": "must be greater than or equal to 0",
"path": "ping.addressee.age",
"value": "-2"
}
],
"propertyViolations": [],
"returnValueViolations": []
}
请注意,您应该将-parameters
传递给编译器,否则path
将是ping.arg0.age
。
答案 2 :(得分:0)