无法从 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