Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @在dropwizard API资源中有效_Java_Dropwizard - Fatal编程技术网

Java @在dropwizard API资源中有效

Java @在dropwizard API资源中有效,java,dropwizard,Java,Dropwizard,在API使用对象之前,我正在尝试在dropwizard中使用@Valid。但是,对象的所有属性都没有得到验证,因为验证似乎没有发生?我是否在添加配置以启用它时遗漏了什么 仅供参考:我们已经实现了自己的消息体阅读器,它从javax.ws.rs.ext.MessageBodyReader扩展,用于将JSON映射到对象 您需要在MessageBodyReader中存储javax.validation.Validator对象,并使用它来验证readFrom方法中带有@Valid注释的类。Dropwiza

在API使用对象之前,我正在尝试在dropwizard中使用@Valid。但是,对象的所有属性都没有得到验证,因为验证似乎没有发生?我是否在添加配置以启用它时遗漏了什么

仅供参考:我们已经实现了自己的消息体阅读器,它从javax.ws.rs.ext.MessageBodyReader扩展,用于将JSON映射到对象

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

因此,代码如下所示:

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模式进行验证。而且它不会基于注释。