【问题标题】:Can't Generate Json schema from POJO无法从 POJO 生成 Json 模式
【发布时间】:2018-03-26 10:12:44
【问题描述】:

我使用了一个 POJO,它工作正常,我决定使用 org.apache.commons 中的 FileUtils 在一堆 java 类中工作,以遍历所有 java 文件目录并在 generateSchema() 中使用 get class() Jackson 模块,但输出不是预期的。

不知道问题出在哪里?

输入:

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);

一个文件的例子

输出:

{
  "type" : "string"
}

预期输出:

{
  "type" : "object",
  "properties" : {
    "result" : {
      "type" : "string"
    },
    "subtitle1" : {
      "type" : "string"
    },
    "infoSup" : {
      "type" : "string"
    },
    "subtitle" : {
      "type" : "string"
    },
    "title" : {
      "type" : "string"
    },
    "info" : {
      "type" : "string"
    }
  }
}

【问题讨论】:

    标签: java json jackson jsonschema


    【解决方案1】:
    generator.generateSchema(file.getClass());
    

    file 是一个 File 不是你想要的类。我认为您至少需要 Class,甚至可以实例化它:

    Class c = Class.forName(className);
    generator.generateSchema(c.getClass());
    

    如果你必须实例化它,每个类都应该有一个空的默认构造函数,Reflection 应该得到这个:

    Constructor ctor = c.getConstructor(); // use c again
    Object instanceOfTheClass = ctor.newInstance();
    generator.generateSchema(instanceOfTheClass.getClass());
    

    【讨论】:

    • 没用 ⌣̩̩́_⌣̩̩̀ ,它说 > 尽管它存在!
    • 以后在家试试,应该不会有问题的。
    • 我使用了带有完整包名的 Class.forName() 但 NotFoundException 仍然存在!
    【解决方案2】:

    下面的代码可以帮助我获取给定包中的所有类

     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

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 1970-01-01
      • 2015-01-19
      • 2015-03-07
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多