java - 带注释的条件验证
问题描述
我正在构建一个 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
属性验证它们。我不想自己写验证。我想知道是否已经有带有条件检查的注释。
解决方案
您可以为两个配置构建器创建一个基类:
@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
您传递的信息找到正确的实现,因此会相应地验证参数。
推荐阅读
- ios - Flutter 应用在 ios 模拟器上不显示任何内容
- javascript - 在 jquery 预加载器之后运行 css 动画
- feature-engineering - 使用 FeatureTools 从每日汇总每月数据
- html - Bootstrap 4卡保持缩放而不是在固定区域内调整
- .net - 停止 Visual Studio 在输出目录中复制 Nuget 包
- javascript - 强制孩子占用相同的空间但从 0、0 开始?
- javascript - 无法在嵌套地图中返回 jsx 反应 javascript
- javascript - 用于组合 Typescript 和 Javascript 项目的 Eslint 规则?
- python - Python PIL putdata 颜色必须是 int 或 tuple
- java - Firebase Cloud Messaging Android 从托盘而不是新实例打开正在运行的应用程序实例