Java @在dropwizard API资源中有效
在API使用对象之前,我正在尝试在dropwizard中使用@Valid。但是,对象的所有属性都没有得到验证,因为验证似乎没有发生?我是否在添加配置以启用它时遗漏了什么 仅供参考:我们已经实现了自己的消息体阅读器,它从javax.ws.rs.ext.MessageBodyReader扩展,用于将JSON映射到对象 您需要在MessageBodyReader中存储javax.validation.Validator对象,并使用它来验证readFrom方法中带有@Valid注释的类。Dropwizard的Jackson提供商就是这样做的 因此,代码如下所示:Java @在dropwizard API资源中有效,java,dropwizard,Java,Dropwizard,在API使用对象之前,我正在尝试在dropwizard中使用@Valid。但是,对象的所有属性都没有得到验证,因为验证似乎没有发生?我是否在添加配置以启用它时遗漏了什么 仅供参考:我们已经实现了自己的消息体阅读器,它从javax.ws.rs.ext.MessageBodyReader扩展,用于将JSON映射到对象 您需要在MessageBodyReader中存储javax.validation.Validator对象,并使用它来验证readFrom方法中带有@Valid注释的类。Dropwiza
private static final Class<?>[] DEFAULT_GROUP_ARRAY = new Class<?>[]{ Default.class };
private final XmlMapper mapper;
private final Validator validator;
public MyMessageBodyReader(XmlMapper mapper, Validator validator) {
this.validator = validator;
this.mapper = mapper;
setMapper(mapper);
}
@Override
public Object readFrom(Class<Object> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException {
return validate(annotations, super.readFrom(type,
genericType,
annotations,
mediaType,
httpHeaders,
entityStream));
}
private Object validate(Annotation[] annotations, Object value) {
final Class<?>[] classes = findValidationGroups(annotations);
if (classes != null) {
final Set<ConstraintViolation<Object>> violations = validator.validate(value, classes);
if (!violations.isEmpty()) {
throw new ConstraintViolationException("The request entity had the following errors:",
ConstraintViolations.copyOf(violations));
}
}
return value;
}
private Class<?>[] findValidationGroups(Annotation[] annotations) {
for (Annotation annotation : annotations) {
if (annotation.annotationType() == Valid.class) {
return DEFAULT_GROUP_ARRAY;
} else if (annotation.annotationType() == Validated.class) {
return ((Validated) annotation).value();
}
}
return null;
}
我举了一个例子,其中我编写了一个带有验证支持的自定义XML Jackson Reader+Writer。你能发布你的代码吗?你在要验证的java类上添加了验证注释了吗?@MasterMind我想你是在说@Size、@NotEmpty等注释。是的,我确实向java类添加了注释,并尝试使用数据对其进行测试,这些数据应该不会通过约束,但它没有!我不希望我的验证代码驻留在阅读器中,因为它将成为阅读器的责任。我正在寻找在读取器序列化之前或之后调用的验证器实现,以验证传入的json并返回它(如果无效)。Hibernate验证器验证反序列化的POJO,因此不能在传入的json字符串上调用它。您想要使用的注释,如@NotEmpty或@Size,在POJO中声明。那么,当POJO没有首先反序列化时,如何进行验证呢?如果您确实希望在不进行反序列化的情况下验证JSON字符串,则需要使用类似于XSD for XML的JSON模式进行验证。而且它不会基于注释。