我正在使用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;
}
答案 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
,执行所需的验证。