这是我的问题,在这个例子中我有 2 个类(但几乎 10 个 IRL)从 xsd 自动生成
public Toto {
public Toto(String date, String valueFromToto) {
this.date = date;
this.valueFromToto = valueFromToto;
}
public String getDate() {
return this.date;
}
public String getValueFromToto() {
return this.valueFromToto;
}
}
public Titi {
public Titi(String date, String valueFromTiti) {
this.date = date;
this.valueFromTiti = valueFromTiti;
}
public String getDate() {
return this.date;
}
public String getValueFromTiti() {
return this.valueFromTiti ;
}
}
我希望每个类(class)都有相同的流程 但我不知道最好的方法来做到这一点。我正在寻找“反射”,但这似乎是一个糟糕的解决方案。功能接口(interface)怎么样?
public String test(List<Toto or Titi> liste, LocalDate date) {
for (Toto or Titi o : liste) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyy");
LocalDate localDateToTest = LocalDate.parse(o.getDate(), formatter);
if (date.isAfter(localDateToTest))
return o.getValueFromToto() or o.getValueFromTiti();
}
return "";
}
如果有人能指出我正确的方向 提前致谢
最佳答案
JAXB2 绑定(bind)可用于自定义代码生成,以便两个方法具有相同的名称。并且 JAXB2 Basics Inheritance 插件 ( https://github.com/highsource/jaxb2-basics/wiki/JAXB2-Inheritance-Plugin ) 可用于使它们都继承一个接口(interface)。
基本上,您将提供一个像这样的绑定(bind)文件(*.xjb)(这只是一个示例,未经测试):
<?xml version="1.0"?>
<jxb:bindings
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
jxb:extensionBindingPrefixes="inheritance"
jxb:version="2.1">
<jxb:bindings schemaLocation="MyXSD.xsd">
<jxb:bindings node="//xs:complexType[@name='Toto']//xs:element[@name='valueFromToto']">
<jxb:property name="value"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name='Toto']">
<jxb:class name="Toto" />
<inheritance:implements>org.example.WithValue</inheritance:implements>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name='Titi']//xs:element[@name='valueFromTiti']">
<jxb:property name="value"/>
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name='Titi']">
<jxb:class name="Toto" />
<inheritance:implements>org.example.WithValue</inheritance:implements>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
org.example.WithValue
看起来像这样:
package org.example;
public interface WithValue {
String getValue();
}
如果您使用 Maven 从 XSD 生成代码,则插件配置将如下所示(其中 XSD 和绑定(bind)文件都位于/src/main/resources/xsd/目录中):
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>${maven-jaxb2-plugin.version}</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<bindingDirectory>${project.basedir}/src/main/resources/xsd/</bindingDirectory>
<schemaDirectory>${project.basedir}/src/main/resources/xsd/</schemaDirectory>
<args>
<arg>-Xinheritance</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>${jaxb2-basics.version}</version>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>
关于java - 如何对具有不同方法名称但相同返回类型的不同对象应用相同的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60974942/