JSON-B REST有效负载验证

时间:2018-04-29 14:19:55

标签: java rest validation jsonb-api

我使用JSON-B开发了一个Java REST服务,将传入的有效负载映射到POJO。

现在我要做的是验证传入的有效负载,可能是针对JSON模式,但到目前为止我还没有找到任何意义上的任何内容......

是否可以覆盖默认的JSON-B映射过程,从而捕获任何映射异常并自行处理它?<​​/ p>

3 个答案:

答案 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)

如果您确实坚持使用JSON模式,则可以通过使用Justify来实现反序列化时验证JSON文档。有一个Binding示例,显示了如何将JSON验证程序与JSON-B一起使用。我希望示例代码可以为您提供帮助。

完全公开:我是图书馆的作者。