Java 接口和扩展ArrayList的Spring引导验证
我正在使用带hibernate验证程序的spring boot 我有一个用@Validated注释的控制器,我想验证API中的所有参数 其中一个注释不起作用(我调试了它,但它从未被检查过,就好像它根本没有注释一样) MyRequest类如下所示: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
@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注释,但仍然不起作用。
我错过了什么
其他注释在不同的类中确实有效,但我无法解决此问题:/