Spring Boot Rest API枚举一些Java类型



我正在构建Spring Boot webflux REST API功能,该功能需要使用包含少量Java类型(例如,String、Integer、Double(信息的数据作为JSON请求/响应的一部分。表示Java类型的属性在mongodb中也必须是可持久的(一旦JSON可以使用这样的属性,就不会有问题(。我有下面的模型类和类型枚举,REST API使用它来序列化/反序列化JSON消息。

@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
}

序列化和反序列化工作正常。现在的问题是,当我想解决存储在Map<String, SchemeTypes> properties映射中的真实Java类型时,我需要进行类似的映射(只是抽象而不是真实代码(:

SchemeTypes.INTEGER => Java Integer class  
SchemeTypes.STRING => Java String class  
SchemeTypes.DOUBLE => Java Double class  

有没有更简单的方法来表示存储在模型类中并在序列化/反序列化的JSON文件中使用的Java类型,这样我就可以直接使用它来推断Java类型,而无需额外验证它是有效的Java类型。例如,如果类型的枚举内部提到的枚举将具有与真实Java类型完全相同的命名,则我可以在没有任何映射的情况下执行以下操作:

public void deduceClass(SchemeTypes type) {
Class myClass = Class.forName(type.toString());
}

请注意,我正在寻找一个开箱即用的解决方案(我不必验证用户提供的类型(。如果这样的解决方案更难实现,我会坚持使用映射。

如果你没有保存这个实体,我可以说你实际上可以直接将SchemeTypes映射到相应的类中,比如下面的

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实例,只保存enum的名称来克服这个问题,比如下面的

private final Map<String, String> properties;

并在这个类上使用静态方法找到相应的clazz值,如下面的

public static Class findClazzFor(String schemeTypeName){
return SchemeTypes.valueOf(schemeTypeName).getClazz();
}

尽管如此,我认为最干净的解决方案是将SchemeType类实例映射保留为一对一映射。并按照上面的getClazz方法为提供的schemeType检索相应的类。

最新更新