我们试图避免在Java和Python一起使用的项目中出现重复的代码。大多数代码库都是Java语言,由于机器学习环境的盛行,现在添加了Python。
在绿地场景中,我们将从sth开始。例如swagger或protobuf,然后从生成的代码中导出模型。但这现在不起作用。
J类带有一些注释,它们针对Java 8。
在研究过程中,我发现了以下可能的途径将类的结构(不带方法)转换为Python类结构:
生成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模式
我可以找到以下选项:
这是基础,库下面也在内部使用。
使用以下带有选项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
还有一些要点
我已经研究了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(...); 我有…