javasoapwsdlcxfwsdl2java

wsdl2java - how to force wrapped response return type instead of using out parameters wrapped in Holders?


Using wsdl2java tool to generate client classes, I can't seem to able to force to wrap Web Service response in a return type - the return type is always void and OUT parameters wrapped in Holders are generated. Auth.java auto-generated client interface looks like this:

@WebService(targetNamespace = "http://xml.kamsoft.pl/ws/auth", name = "Auth")
@XmlSeeAlso({pl.kamsoft.xml.ws.common.ObjectFactory.class, pl.kamsoft.xml.ws.kaas.login_types.ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface Auth {

    // [...] - `logout`, `changePassword`, `changePasswordLog` methods

    @WebMethod(action = "login")
    public void login(

        @WebParam(partName = "request", name = "login", targetNamespace = "http://xml.kamsoft.pl/ws/kaas/login_types")
        pl.kamsoft.xml.ws.kaas.login_types.LoginRequest request,
        @WebParam(partName = "response", mode = WebParam.Mode.OUT, name = "loginReturn", targetNamespace = "http://xml.kamsoft.pl/ws/kaas/login_types")
        jakarta.xml.ws.Holder<java.lang.String> response,
        @WebParam(partName = "session", mode = WebParam.Mode.OUT, name = "session", targetNamespace = "http://xml.kamsoft.pl/ws/common", header = true)
        jakarta.xml.ws.Holder<pl.kamsoft.xml.ws.common.Session> session,
        @WebParam(partName = "token", mode = WebParam.Mode.OUT, name = "authToken", targetNamespace = "http://xml.kamsoft.pl/ws/common", header = true)
        jakarta.xml.ws.Holder<pl.kamsoft.xml.ws.common.AuthToken> token
    ) throws pl.kamsoft.wsdl.common.AuthenticationExceptionMsg, pl.kamsoft.wsdl.common.ServerExceptionMsg, PassExpiredExceptionMsg, pl.kamsoft.wsdl.common.AuthTokenExceptionMsg, pl.kamsoft.wsdl.common.InputExceptionMsg, pl.kamsoft.wsdl.common.AuthorizationExceptionMsg;
}

Minimal example (build.gradle.kts file with Gradle configuration):

plugins {
    java
    id("com.yupzip.wsdl2java") version "3.0.0"
}

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.apache.cxf:cxf-rt-frontend-jaxws:4.0.0")
    implementation("org.apache.cxf:cxf-rt-transports-http-hc5:4.0.0")
    wsdl2java("com.sun.xml.bind:jaxb-impl:4.0.1")
    wsdl2java("org.apache.cxf.xjc-utils:cxf-xjc-runtime:4.0.0")
    wsdl2java("jakarta.xml.ws:jakarta.xml.ws-api:4.0.0")
    wsdl2java("com.sun.xml.ws:rt:4.0.0")
    wsdl2java("org.jvnet.jaxb2_commons:jaxb2-namespace-prefix:2.0")
    wsdl2java("codes.rafael.jaxb2_commons:jaxb2-basics-runtime:3.0.0")
    wsdl2java("codes.rafael.jaxb2_commons:jaxb2-basics:3.0.0")
}

wsdl2java {
    wsdlDir = file("$projectDir/src/main/resources/")
    includeJava8XmlDependencies = false
    cxfVersion = "4.0.0"
    cxfPluginVersion = "4.0.0"
    wsdlsToGenerate = listOf(
        listOf(
            "-wsdlLocation", "https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl",
            "-autoNameResolution",
            "https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl",
        )
    )
}

How can I force wsdl2java tool to generate LoginResponse class of which instance would be returned on Auth#login invocation?

I've tried to include binding file (bindings.xml):

<bindings
        wsdlLocation="https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns="http://java.sun.com/xml/ns/jaxws">
    <enableWrapperStyle>false</enableWrapperStyle>
</bindings>

but neither setting enableWrapperStyle to false or true did change anything. Here is how my configuration looked like (build.gradle.kts):

wsdl2java {
    wsdlDir = file("$projectDir/src/main/resources/")
    includeJava8XmlDependencies = false
    cxfVersion = "4.0.0"
    cxfPluginVersion = "4.0.0"
    wsdlsToGenerate = listOf(
        listOf(
            "-b", "$projectDir/src/main/resources/wsdl/bindings.xml",
            "-wsdlLocation", "https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl",
            "-autoNameResolution",
            "https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl",
        )
    )
}

Can the fact that both session and token are declared as wsdlsoap:header have impact on the resulting generated Java code?


Solution

  • Simpliest way - pass bareMethods parameter to wsdl2java:

    wsdl2java {
    wsdlDir = file("$projectDir/src/main/resources/")
    includeJava8XmlDependencies = false
    cxfVersion = "4.0.0"
    cxfPluginVersion = "4.0.0"
    wsdlsToGenerate = listOf(
        listOf(
            "-b", "$projectDir/src/main/resources/wsdl/bindings.xml",
            "-wsdlLocation", "https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl",
            "-autoNameResolution",
            "-bareMethods",
            "https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl",
        )
    )}