首页 > 解决方案 > 带注释的条件验证

问题描述

我正在构建一个 API 来为我的系统创建一个配置项。API 将接收以下主体之一:

{
  configType: "FILE",
  settings: {
    type: "CSV",
    location: "/folder/file.csv"
  }
}

或者

{
  configType: "LDAP",
  settings: {
    ou: "CN=Users,OU=domain,OU=com",
    attribute: "sAMaccountName"
  }
}

如您所见,settings对象是不同的。今天我有两个端点:

@POST
@Path("/configurations/file")
@Consumes(MediaType.APPLICATION_JSON)
public Response createFileConfig(@Valid FileConfigBuilder config)

@POST
@Path("/configurations/ldap")
@Consumes(MediaType.APPLICATION_JSON)
public Response createLdapConfig(@Valid LdapConfigBuilder config)

我的目标是拥有一个单一的端点 ( POST /configurations),它允许我发送上面的任何正文并根据configType属性验证它们。我不想自己写验证。我想知道是否已经有带有条件检查的注释。

标签: javajpaannotationsopenjpa

解决方案


您可以为两个配置构建器创建一个基类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "configType")
@JsonSubTypes(
{
    @JsonSubTypes.Type(value = FileConfigBuilder.class, name = "FILE"),
    @JsonSubTypes.Type(value = LdapConfigBuilder.class, name = "LDAP"),
}
)
public class ConfigBuilder {

}

你让你的两个类扩展这个基类(不要忘记@JsonCreator在构造函数上提供正确的):

public final class FileConfigBuilder extends ConfigBuilder

public final class LdapConfigBuilder extends ConfigBuilder

并在端点中将该类作为参数:

@POST
@Path("/configurations/file")
@Consumes(MediaType.APPLICATION_JSON)
public Response createConfig(@Valid ConfigBuilder config)

Spring 应该根据configType您传递的信息找到正确的实现,因此会相应地验证参数。


推荐阅读