Java 接口和扩展ArrayList的Spring引导验证

Java 接口和扩展ArrayList的Spring引导验证,java,spring-boot,validation,hibernate-validator,Java,Spring Boot,Validation,Hibernate Validator,我正在使用带hibernate验证程序的spring boot 我有一个用@Validated注释的控制器,我想验证API中的所有参数 其中一个注释不起作用(我调试了它,但它从未被检查过,就好像它根本没有注释一样) MyRequest类如下所示: @Valid public class MyRequest{ boolean shouldSumSubRules; private @Valid RulesSelector rules; @JsonTypeInfo(use = Jso

我正在使用带hibernate验证程序的spring boot 我有一个用@Validated注释的控制器,我想验证API中的所有参数

其中一个注释不起作用(我调试了它,但它从未被检查过,就好像它根本没有注释一样)

MyRequest类如下所示:

@Valid
public class MyRequest{
    boolean shouldSumSubRules;
    private @Valid RulesSelector rules;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
        @JsonSubTypes.Type(value = RulesStaticList.class, name = "list"),
        @JsonSubTypes.Type(value = RulesDynamicList.class, name = "criteria")
})
@Valid
public interface RulesSelector {
}
@Valid
public class RulesStaticList extends ArrayList<@Valid RuleReference> implements RulesSelector {
}
@JsonDeserialize(using = RuleReferenceDeserializer.class)
@Valid
public interface RuleReference {
    RuleReferenceKind getKind();
}

final class RuleReferenceDeserializer extends StdDeserializer<RuleReference>  {
    public RuleReferenceDeserializer() {
        super(RuleReference.class);
    }

    @Override
    public RuleReference deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String fieldName = p.nextFieldName();
        switch (fieldName) {
            case "tag":
                return p.readValueAs(RuleReferenceByTag.class);
            case "special":
                return p.readValueAs(RuleReferenceBySpecial.class);
            default:
                throw ctxt.wrongTokenException(p, RuleReference.class, JsonToken.FIELD_NAME, "");
        }
    }
}
@Valid
public class RuleReferenceByTag implements RuleReference {
    @Size(max = 128)
    private String tag;

    public RuleReferenceKind getKind() { return RuleReferenceKind.Tag; }
}
RuleSelector类是一个接口,如下所示:

@Valid
public class MyRequest{
    boolean shouldSumSubRules;
    private @Valid RulesSelector rules;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
        @JsonSubTypes.Type(value = RulesStaticList.class, name = "list"),
        @JsonSubTypes.Type(value = RulesDynamicList.class, name = "criteria")
})
@Valid
public interface RulesSelector {
}
@Valid
public class RulesStaticList extends ArrayList<@Valid RuleReference> implements RulesSelector {
}
@JsonDeserialize(using = RuleReferenceDeserializer.class)
@Valid
public interface RuleReference {
    RuleReferenceKind getKind();
}

final class RuleReferenceDeserializer extends StdDeserializer<RuleReference>  {
    public RuleReferenceDeserializer() {
        super(RuleReference.class);
    }

    @Override
    public RuleReference deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String fieldName = p.nextFieldName();
        switch (fieldName) {
            case "tag":
                return p.readValueAs(RuleReferenceByTag.class);
            case "special":
                return p.readValueAs(RuleReferenceBySpecial.class);
            default:
                throw ctxt.wrongTokenException(p, RuleReference.class, JsonToken.FIELD_NAME, "");
        }
    }
}
@Valid
public class RuleReferenceByTag implements RuleReference {
    @Size(max = 128)
    private String tag;

    public RuleReferenceKind getKind() { return RuleReferenceKind.Tag; }
}
RuleStaticList类如下所示:

@Valid
public class MyRequest{
    boolean shouldSumSubRules;
    private @Valid RulesSelector rules;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
        @JsonSubTypes.Type(value = RulesStaticList.class, name = "list"),
        @JsonSubTypes.Type(value = RulesDynamicList.class, name = "criteria")
})
@Valid
public interface RulesSelector {
}
@Valid
public class RulesStaticList extends ArrayList<@Valid RuleReference> implements RulesSelector {
}
@JsonDeserialize(using = RuleReferenceDeserializer.class)
@Valid
public interface RuleReference {
    RuleReferenceKind getKind();
}

final class RuleReferenceDeserializer extends StdDeserializer<RuleReference>  {
    public RuleReferenceDeserializer() {
        super(RuleReference.class);
    }

    @Override
    public RuleReference deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String fieldName = p.nextFieldName();
        switch (fieldName) {
            case "tag":
                return p.readValueAs(RuleReferenceByTag.class);
            case "special":
                return p.readValueAs(RuleReferenceBySpecial.class);
            default:
                throw ctxt.wrongTokenException(p, RuleReference.class, JsonToken.FIELD_NAME, "");
        }
    }
}
@Valid
public class RuleReferenceByTag implements RuleReference {
    @Size(max = 128)
    private String tag;

    public RuleReferenceKind getKind() { return RuleReferenceKind.Tag; }
}
我在任何地方都添加了@Valid注释,但仍然不起作用。 我错过了什么

其他注释在不同的类中确实有效,但我无法解决此问题:/