Dropwizard protobuf验证

时间:2016-09-10 18:20:14

标签: java jersey dropwizard

我正在使用dropwizard并提供支持json和protobuf的服务。我非常喜欢请求类中字段的@Valid表示法和注释。问题是@Valid表示法仅适用于json,而不适用于protobuf。对于如何使@Valid注释无论媒体类型如何都有办法或好的方法?

示例服务:

@POST
@Produces({
        MediaType.APPLICATION_JSON, "application/x-protobuf"
})
@Consumes({
        MediaType.APPLICATION_JSON, "application/x-protobuf"
})
@Path("/foo")
void foo(@Valid Request request);

public class Request
{
  @NotBlank(message = "Missing info")
  String field;
}

1 个答案:

答案 0 :(得分:0)

版本1.0.0之前的Dropwizard中的验证是在JacksonMessageBodyProvider类中完成的,该类基本上是MessageBodyReader(负责反序列化POJO的类)。

正如班级中的名字杰克逊所描述的那样,此功能可能只适用于基于JSON的实体。

话虽如此,唯一的选择是通过编写这段代码在资源方法中自己执行验证,

Validator validator = environment.getValidator();
Set<ConstraintViolation<T>> violations = validator.validate(object, validationGroups);

迭代违规设置以识别请求POJO中的所有违规,当您返回HTTP 4xx错误响应时,可以在有效负载中发送这些违规。

从1.0.0开始,在Github上使用此Pull Request。将验证逻辑从Jackson移到Jersey应该基本上允许其他实体类型使用该功能。 DropwizardConfiguredValidator实现在Jersey中注册为ConfiguredValidator,执行所需的验证。