gpt4 book ai didi

java - @Valid 在 dropwizard API 资源中有效

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:55 26 4
gpt4 key购买 nike

我尝试在 API 使用对象之前在 dropwizard 中使用 @Valid。但是,对象的任何属性都没有得到验证,因为似乎验证没有发生?我在添加配置来启用它时是否遗漏了某些内容?

仅供引用:我们已经实现了自己的消息正文读取器,该读取器从 javax.ws.rs.ext.MessageBodyReader 扩展,用于将 JSON 映射到对象。

最佳答案

您需要在 MessageBodyReader 中存储 javax.validation.Validator 对象,并使用它来验证 readFrom() 方法中用 @Valid 注释的类。这就是 Dropwizard 的 Jackson Provider 的做法。

所以代码看起来像这样:

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;
}

我有一个例子here ,我在其中编写了一个具有验证支持的自定义 XML Jackson Reader + Writer。

关于java - @Valid 在 dropwizard API 资源中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30217196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com