[英]Spring Boot Rest API Enumerate some Java types
I am building Spring Boot webflux REST API functionality that needs to work with data containing few Java type's (let's consider String, Integer, Double for example) information as part of JSON request/responses. 代表 Java 类型的属性也必须在 mongodb 内持久化(一旦 JSON 可以使用此类属性,则应该不会有问题)。 I have following model class and type enumeration which is used by REST API to serialize/deserialize JSON message's.
@Getter
@ToString
@EqualsAndHashCode(exclude = "id")
@Document(collection = "core_scheme")
@JsonDeserialize(builder = SchemeModel.Builder.class)
@Builder(builderClassName = "Builder", toBuilder = true, setterPrefix = "with")
public class SchemeModel {
@Id
private final String id;
@Field(name = "userId") private final String userId;
@Field(name = "date") private final String creationDate;
@Field(name = "properties") private final Map<String, SchemeTypes> properties;
}
public enum SchemeTypes {
INTEGER, STRING, DOUBLE
}
序列化和反序列化工作得很好。 现在的问题是,当我想解决真正的 Java 类型存储在Map<String, SchemeTypes> properties
map 中时,我需要进行类似于此的映射(只是抽象而不是实际代码):
SchemeTypes.INTEGER => Java Integer class
SchemeTypes.STRING => Java String class
SchemeTypes.DOUBLE => Java Double class
Is there any more simple way to represent Java type's stored inside model class and used within serialized/deserialized JSON file's so i can directly use it to deduce Java type without additional validation that it's valid Java type. 例如,如果在提到的枚举中枚举的类型与真正的 Java 类型的命名完全相同,我可以在没有任何映射的情况下执行以下操作:
public void deduceClass(SchemeTypes type) {
Class myClass = Class.forName(type.toString());
}
请注意,我正在寻找一种开箱即用的解决方案(我不必验证用户提供的类型)。 如果这样的解决方案更难像提到的映射那样实现,我会坚持使用映射。
如果您不保存此实体,我可以说您实际上可以直接将 SchemeTypes map 转换为相应的 class 如下所示
public enum SchemeTypes {
INTEGER(Integer.class), STRING(String.class), DOUBLE(Double.class);
private final Class clazz;
private SchemeTypes(Class clazz){
this.clazz = clazz;
}
public Class getClazz(){
return clazz;
}
}
但是当你保存它时,它可能会导致一些问题反序列化。 也许您可以不直接保存 SchemaType 实例,而只保存枚举的名称来克服这个问题,如下所示
private final Map<String, String> properties;
并在此 class 上使用 static 方法找到相应的 clazz 值,如下所示
public static Class findClazzFor(String schemeTypeName){
return SchemeTypes.valueOf(schemeTypeName).getClazz();
}
尽管如此,我认为最干净的解决方案是将 SchemeType class 实例映射保留为一对一的 map。 并为提供的方案类型检索相应的 class,如上面的 getClazz 方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.