【问题标题】:Conditional validation with annotation带注释的条件验证
【发布时间】:2023-09-21 20:47:02
【问题描述】:

我正在构建一个 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 属性验证它们。我不想自己写验证。我想知道是否已经有带有条件检查的注释。

【问题讨论】:

    标签: java jpa annotations openjpa


    【解决方案1】:

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

    @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 找到正确的实现,因此会相应地验证参数。

    【讨论】: