Generate the Model classes from WSDL
quarkus-cxf extension supports generating Java classes from WSDL during Quarkus code generation phase.
|
Code examples
The code snippets shown in this section come from the client integration test in the source tree of Quarkus CXF. You may want to check it as an executable example. |
You need to set up a couple of things for CXF code generation to work:
-
Have
io.quarkiverse.cxf:quarkus-cxfdependency in your project -
For Maven projects, the
generate-codegoal needs to be present in the configuration ofquarkus-maven-plugin:pom.xml<plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> </goals> </execution> </executions> </plugin> -
For Gradle projects no additional configurarion of
io.quarkusplugin is needed -
Put your WSDL files under
src/main/resourcesorsrc/test/resourcesor any subdirectory thereof. -
Your WSDL file names must end with
.wsdl -
Set
quarkus.cxf.codegen.wsdl2java.includesconfiguration property to a pattern matching the WSDL files you wish to process. If you want to process all WSDL files undersrc/main/resources/wsdlorsrc/test/resources/wsdl, set it as follows:application.propertiesquarkus.cxf.codegen.wsdl2java.includes = wsdl/*.wsdl
This will generate Java classes in target/generated-sources/wsdl2java or
target/generated-test-sources/wsdl2java directory.
They will be automatically picked by the compiler plugin there.
Hence we are free to refer to them from our application or test code.
|
Note that |
Passing custom parameters to wsdl2java is possible through
quarkus.cxf.codegen.wsdl2java.additional-params
configuration parameter.
If you need different additional-params for each WSDL file, you may want to define a separate named parameter set for
each one of them. Here is an example:
# Parameters for foo.wsdl
quarkus.cxf.codegen.wsdl2java.foo-params.includes = wsdl/foo.wsdl
quarkus.cxf.codegen.wsdl2java.foo-params.wsdl-location = wsdl/foo.wsdl
# Parameters for bar.wsdl
quarkus.cxf.codegen.wsdl2java.bar-params.includes = wsdl/bar.wsdl
quarkus.cxf.codegen.wsdl2java.bar-params.wsdl-location = wsdl/bar.wsdl
quarkus.cxf.codegen.wsdl2java.bar-params.xjc = ts
|
Add |
Non ASCII Characters
Sometimes the wsdl2java autogenerated Java classes may not be fully compatible with GraalVM due to non ASCII characters getting included in the code. Similar exceptions to the below may appear during native image builds.
[quarkus-dalkia-ticket-loader-1.0.0-SNAPSHOT-runner:26] compile: 161 459,15 ms, 8,54 GB
[quarkus-dalkia-ticket-loader-1.0.0-SNAPSHOT-runner:26] image: 158 272,73 ms, 8,43 GB
[quarkus-dalkia-ticket-loader-1.0.0-SNAPSHOT-runner:26] write: 205,82 ms, 8,43 GB
Fatal error:com.oracle.svm.core.util.VMError$HostedError: java.lang.RuntimeException: oops : expected ASCII string! com.oracle.svm.reflect.OperationOrderStatusType_CRÉÉ_f151156b0d42ecdbdfb919501d8a86dda8733012_1456.hashCode
at com.oracle.svm.core.util.VMError.shouldNotReachHere(VMError.java:72)
Below is an example of auto-generated non ASCII characters in a Java class:
@XmlType(name = "OperationOrderStatusType")
@XmlEnum
public enum OperationOrderStatusType {
@XmlEnumValue("Cr\u00e9\u00e9")
CRÉÉ("Cr\u00e9\u00e9"),
@XmlEnumValue("A communiquer")
A_COMMUNIQUER("A communiquer"),
@XmlEnumValue("En attente de r\u00e9ponse")
EN_ATTENTE_DE_RÉPONSE("En attente de r\u00e9ponse"),
@XmlEnumValue("Attribu\u00e9")
ATTRIBUÉ("Attribu\u00e9"),
@XmlEnumValue("Clotur\u00e9")
CLOTURÉ("Clotur\u00e9"),
@XmlEnumValue("Annul\u00e9")
ANNULÉ("Annul\u00e9");
private final String value;
OperationOrderStatusType(String v) {
value = v;
}
public String value() {
return value;
}
public static OperationOrderStatusType fromValue(String v) {
for (OperationOrderStatusType c: OperationOrderStatusType.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
}
Anything starting with \u will be a problem. Consequently the following refactoring is needed:
@XmlType(name = "OperationOrderStatusType")
@XmlEnum
public enum OperationOrderStatusType {
@XmlEnumValue("Créé")
CREE("Créé"),
@XmlEnumValue("A communiquer")
A_COMMUNIQUER("A communiquer"),
@XmlEnumValue("En attente de réponse")
EN_ATTENTE_DE_REPONSE("En attente de réponse"),
@XmlEnumValue("Attribué")
ATTRIBUE("Attribué"),
@XmlEnumValue("Cloturé")
CLOTURE("Cloturé"),
@XmlEnumValue("Annulé")
ANNULE("Annulé");
private final String value;
OperationOrderStatusType(String v) {
value = v;
}
public String value() {
return value;
}
public static OperationOrderStatusType fromValue(String v) {
for (OperationOrderStatusType c: OperationOrderStatusType.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
}