如何验证使用Jackson多态反序列化反序列化的对象

3

给定以下请求:

/enterprises-api/{{version}}/enterprises?query={"searchType":"FOUNDERSEARCH","maxResult":"61",...}

或者

/enterprises-api/{{version}}/enterprises?query={"searchType":"NAMEORADDRESSSEARCH","maxResult":"61",...}

我已经成功将查询反序列化为FounderSearch或NameOrAddressSearch对象,具体取决于searchType属性。
但是,由于这不是顶级对象,因此忽略了Javax验证。我该如何解决这个问题? 顶层对象:
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "searchType")
@JsonSubTypes({
        @JsonSubTypes.Type(value = FounderSearch.class, name = "FOUNDERSEARCH"),
        @JsonSubTypes.Type(value = NamerOrAddressSearch.class, name = "NAMEORADDRESSSEARCH")
})
public abstract class Query {
    public abstract boolean isFounderSearch();
}

其中一个子级对象:

@Data
public class FounderSearch extends QueryObject {

    @Min(1) @Max(60)
    private Integer maxResult = 20;
    @Pattern(regexp = "\\d{11}")
    private String personNumber;
    private List<CodeType> functions;
    private Boolean activeFunctions;

    public boolean isFounderSearch() {
        return true;
    }

    public SearchType getSearchType() {
        return SearchType.FOUNDERSEARCH;
    }
}

你是怎么解决这个问题的?我也遇到了同样的问题。 - Yakov Burtsev
很遗憾,我不记得了。我已经无法访问那个源代码了。 - Quinten Scheppermans
在我的情况下,当我在超类型声明的属性中添加 @field:Valid 时,代码可以正常工作。我正在使用 Kotlin。 - Yakov Burtsev
1个回答

1
如果您在嵌套对象上添加@Valid注释,它也会起作用。
类似这样,在具有验证约束的所有字段上方。
@Data public class FounderSearch extends QueryObject {
@Min(1) @Max(60)
@Valid
private Integer maxResult = 20;
@Pattern(regexp = "\\d{11}")
@Valid
private String personNumber;
private List<CodeType> functions;
private Boolean activeFunctions;

public boolean isFounderSearch() {
    return true;
}

public SearchType getSearchType() {
    return SearchType.FOUNDERSEARCH;
}

}


1
告诉我在哪里,没有我可以放置它的字段。 - Quinten Scheppermans
在我的情况下,当我在超类型声明的属性中添加@field:Valid时,它起作用了。我正在使用Kotlin。 - Yakov Burtsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接