无法从 POJO 生成 Json 架构
Can't Generate Json schema from POJO
我使用了一个 POJO,它工作正常,我决定使用来自 org.apache.commons 的 FileUtils 在一堆 java classes 中工作,以遍历所有 java 文件目录并在 Jackson 模块的 generateSchema() 中使用 get class(),但输出不是预期的。
不知道问题出在哪里?
输入:
File dir = new File("./src/main/java/com/hiveprod/generator/jsonshema");
String[] extensions = new String[] { "java" };
System.out.println("Getting POJOs..." );
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
for (File file : files) {
String className=file.getName();
//Mapping...
ObjectMapper mapper = new ObjectMapper();
JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper);
JsonSchema jsonSchema = generator.generateSchema(file.getClass());
StringWriter jsonSchemafile = new StringWriter();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
mapper.writeValue(jsonSchemafile, jsonSchema);
example of one file
输出:
{
"type" : "string"
}
预期输出:
{
"type" : "object",
"properties" : {
"result" : {
"type" : "string"
},
"subtitle1" : {
"type" : "string"
},
"infoSup" : {
"type" : "string"
},
"subtitle" : {
"type" : "string"
},
"title" : {
"type" : "string"
},
"info" : {
"type" : "string"
}
}
}
generator.generateSchema(file.getClass());
file 是一个文件,而不是您想要的 class。我认为您至少需要 Class,甚至可能实例化它:
Class c = Class.forName(className);
generator.generateSchema(c.getClass());
如果你必须实例化它,每个 class 应该有一个空的默认构造函数,反射应该得到这个:
Constructor ctor = c.getConstructor(); // use c again
Object instanceOfTheClass = ctor.newInstance();
generator.generateSchema(instanceOfTheClass.getClass());
下面的代码帮助我在给定的包
中获取所有 类
private static Class[] getClasses(String packageName)
throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration resources = classLoader.getResources(path);
List dirs = new ArrayList();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList classes = new ArrayList();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes.toArray(new Class[classes.size()]);
}
private static Class[] getClasses(String packageName)
throws ClassNotFoundException, IOException {
ClassLoader classLoader =Thread.currentThread()
.getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration resources = classLoader.getResources(path);
List dirs = new ArrayList();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList classes = new ArrayList();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes.toArray(new Class[classes.size()]);
}
了解更多:https://dzone.com/articles/get-all-classes-within-package
我使用了一个 POJO,它工作正常,我决定使用来自 org.apache.commons 的 FileUtils 在一堆 java classes 中工作,以遍历所有 java 文件目录并在 Jackson 模块的 generateSchema() 中使用 get class(),但输出不是预期的。
不知道问题出在哪里?
输入:
File dir = new File("./src/main/java/com/hiveprod/generator/jsonshema");
String[] extensions = new String[] { "java" };
System.out.println("Getting POJOs..." );
List<File> files = (List<File>) FileUtils.listFiles(dir, extensions, true);
for (File file : files) {
String className=file.getName();
//Mapping...
ObjectMapper mapper = new ObjectMapper();
JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper);
JsonSchema jsonSchema = generator.generateSchema(file.getClass());
StringWriter jsonSchemafile = new StringWriter();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
mapper.writeValue(jsonSchemafile, jsonSchema);
example of one file
输出:
{
"type" : "string"
}
预期输出:
{
"type" : "object",
"properties" : {
"result" : {
"type" : "string"
},
"subtitle1" : {
"type" : "string"
},
"infoSup" : {
"type" : "string"
},
"subtitle" : {
"type" : "string"
},
"title" : {
"type" : "string"
},
"info" : {
"type" : "string"
}
}
}
generator.generateSchema(file.getClass());
file 是一个文件,而不是您想要的 class。我认为您至少需要 Class,甚至可能实例化它:
Class c = Class.forName(className);
generator.generateSchema(c.getClass());
如果你必须实例化它,每个 class 应该有一个空的默认构造函数,反射应该得到这个:
Constructor ctor = c.getConstructor(); // use c again
Object instanceOfTheClass = ctor.newInstance();
generator.generateSchema(instanceOfTheClass.getClass());
下面的代码帮助我在给定的包
中获取所有 类 private static Class[] getClasses(String packageName)
throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration resources = classLoader.getResources(path);
List dirs = new ArrayList();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList classes = new ArrayList();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes.toArray(new Class[classes.size()]);
}
private static Class[] getClasses(String packageName)
throws ClassNotFoundException, IOException {
ClassLoader classLoader =Thread.currentThread()
.getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration resources = classLoader.getResources(path);
List dirs = new ArrayList();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList classes = new ArrayList();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes.toArray(new Class[classes.size()]);
}
了解更多:https://dzone.com/articles/get-all-classes-within-package