将Java类结构转换为Python类 - java

我们试图避免在Java和Python一起使用的项目中出现重复的代码。大多数代码库都是Java语言,由于机器学习环境的盛行,现在添加了Python。

在绿地场景中,我们将从sth开始。例如swagger或protobuf,然后从生成的代码中导出模型。但这现在不起作用。

J类带有一些注释,它们针对Java 8。

在研究过程中,我发现了以下可能的途径将类的结构(不带方法)转换为Python类结构:

  • 从Java类
  • 生成XML模式

  • 从xml模式文件
  • 生成Python类

    附加的好处:两种语言实际上在我们的项目中通过XML进行通信,因此模式文件对于其他用例很有帮助。我们正在使用maven来构建Java,因此最好将其包含在maven流程中。

    我将其包含在pom.xml中:

    <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/jaxb2-maven-plugin -->
    <dependency>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>2.3.1</version>
    </dependency>
    

    以及默认的插件配置

    <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>schemagen</id>
                        <goals>
                            <goal>schemagen</goal>
                        </goals>
                    </execution>
                </executions>
                <!--
                    Use default configuration, implying that sources are read
                    from the directory src/main/java below the project basedir.
    
                    (i.e. getProject().getCompileSourceRoots() in Maven-speak).
                -->
            </plugin>
    

    但我得到一个错误

    [ERROR] Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:2.3.1:schemagen (default-cli) on project common: JAXB errors arose while SchemaGen compiled sources to XML. -> [Help 1]       
    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:2.3.1:schemagen (default-cli) on project common: JAXB errors arose while SchemaGen compiled sources to XML.  
    

    然后,我将JSON模式作为中介进行了研究,但这并没有真正切开它,因为从JSON模式创建Python类源代码并不容易。

    那么,有什么方法可以从Java代码生成简单的“Pojo” Python类吗?没有方法,没有复杂的交叉编译,而是简单的结构转换。我可以从IntelliJ中的Java文件生成UML图,因此所有信息都在那里,我只需要一个有助于转换的工具即可。

    参考方案

    那么,有什么方法可以从Java代码生成简单的“Pojo” Python类吗?

    我尝试了一下,下面是解决方案:

    考虑以下简单的Pojo.java

    public class Pojo {
        private String string = "default";
        public int integer = 1;
        public String getString(){
            return string;
        }
    }
    

    该解决方案将需要3个阶段

    1. Java Pojo到JSON模式

    我可以找到以下选项:

  • FasterXML/jackson-module-jsonSchema:
    这是基础,库下面也在内部使用。
  • mbknor/mbknor-jackson-jsonSchema:上面正式引用以支持json模式的v4。
  • reinert/JJSchema
  • 使用以下带有选项1的相关代码(也可以通过该站点进行访问):

    ObjectMapper MAPPER = new ObjectMapper();
    JsonSchemaGenerator generator = new JsonSchemaGenerator(MAPPER);
    JsonSchema jsonSchema = generator.generateSchema(Pojo.class);
    System.out.println(MAPPER.writeValueAsString(jsonSchema));
    

    得到以下输出json模式字符串:

    {"type":"object","id":"urn:jsonschema:Pojo","properties":{"string":{"type":"string"},"integer":{"type":"integer"}}}
    

    2. JSON模式后处理

    这个阶段是必需的,主要是因为我发现(至少)对于简单的用例而言,下面的3步骤需要一个具有definitions属性的json模式。我猜这是由于模式定义@ http://json-schema.org/的不断发展。此外,我们可以包含title属性,以指定下一步将生成的python类的名称。

    我们可以在上面的步骤1的java程序中轻松地完成这些步骤。我们需要以下形式的json模式字符串:

    {"definitions": {}, "title": "Pojo", "type":"object","id":"urn:jsonschema:Pojo","properties":{"string":{"type":"string"},"integer":{"type":"integer"}}}
    

    注意,只有加法是"definitions": {}, "title": "Pojo"
    3. Json模式到Python类

    frx08/jsonschema2popo似乎做得很好。

    pip install jsonschema2popo
    jsonschema2popo -o /path/to/output_file.py /path/to/json_schema.json
    

    还有一些要点

  • Java-Json模式生成器将仅在输出中包括那些公共的或具有公共getter的属性。
  • 我认为,对于大规模迁移而言,注释Java类将很痛苦。否则,如果这对您来说是可行的,则上述所有Java库都提供了丰富的注释,您可以在其中指定属性是否是必需的以及更多内容。
  • Java Applet的URLConnection与PHP无效 - java

    我已经研究了Oracle文档和示例,但仍然无法正常工作。我有一个Java Applet,它只是尝试使用URLConnection和OutputStreamWriter通过POST将文本字段发送到PHP脚本。 Java方面似乎工作正常,没有引发异常,但是PHP在我的页面上未显示任何输出。我是PHP新手,因此请耐心等待。这是相关的Java部分: try { UR…

    页面加载而不是提交时发生struts验证 - java

    请原谅我;我对Struts有点陌生。我遇到一个问题,即页面加载而不是我实际提交表单时发生了验证。我整天都在论坛上搜寻和搜寻,没有任何运气。我显然做错了一些事情,应该很容易确定,但是我还没有发现问题所在。这是我的struts.xml的片段:<action name="*Test" method="{1}" clas…

    DataSourceTransactionManager和JndiObjectFactoryBean和JdbcTemplate的用途是什么? - java

    以下的用途是什么:org.springframework.jdbc.core.JdbcTemplate org.springframework.jdbc.datasource.DataSourceTransactionManager org.springframework.jndi.JndiObjectFactoryBean <tx:annotatio…

    Struts2中的错误处理 - java

    我对如何在Struts2中进行错误处理感到困惑。我希望在发生错误时将用户引导到一个中心页面。此外,当发生错误时,我希望将其记录下来,因为我使用的是log4j,因此我将其记录为log.error(e.getMessage(), e);但是,在动作类中,如果我捕获到错误(将我的所有代码放入try / catch中),则不会出现中央/常见错误页面。因此,我决定不捕…

    在XSL中访问Hashmap时出现问题 - java

    假设,我有一段代码: Map mappingId = new HashMap(); mappingId.put("1", "1000"); transformer.setParameter("mappingId", mappingId); transformer.transform(...); 我有…