eclipse-ee4j / metro-jax-ws

metro-jax-ws
https://eclipse-ee4j.github.io/metro-jax-ws/
BSD 3-Clause "New" or "Revised" License
70 stars 40 forks source link

WebMethod returns null if there is no other parameter before the holder parameter #598

Open Tomas-Kraus opened 2 years ago

Tomas-Kraus commented 2 years ago

Previously tracked via: https://bugs.openjdk.java.net/browse/JDK-8170462

To reproduce the issue:

  1. wsgen -cp . wstest.EchoImpl against the following java file: package wstest;

import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.xml.ws.Holder; import java.rmi.RemoteException; import javax.jws.soap.SOAPBinding;

@WebService @SOAPBinding(style=SOAPBinding.Style.RPC) public class EchoImpl { @WebMethod public String holderOperation(@WebParam(name="holder1", mode=WebParam.Mode.INOUT)Holder holder1, @WebParam(name="holder2", mode=WebParam.Mode.INOUT)Holder holder2) throws RemoteException{ holder1.value += "1"; holder2.value += "2"; return "success"; } }

  1. start the web service with the following java file: package wstest;

import javax.xml.ws.Endpoint;

public class EchoService { public static void main(String[] args) { Endpoint.publish("http://localhost:8080/WebServices/echoimpl", new EchoImpl()); } }

  1. generate the client: wsimport -keep -p wstest.server http://localhost:8080/WebServices/echoimpl?wsdl

  2. run the client test with the following java file: import java.rmi.; import javax.naming.; import wstest.server.*; import javax.xml.ws.Holder;

public class EchoClient { public static void main(String[] args) { EchoImplService service = new EchoImplService(); EchoImpl port = service.getPort(EchoImpl.class); Holder h1 = new Holder("1"); Holder h2 = new Holder("2"); String result = port.holderOperation(h1, h2);

    System.out.println(result); 
    System.out.println(h1.value); 
    System.out.println(h2.value); 
} 

}

Will get: null 11 22

Note:

  1. Obviously some changes made the result better, now only the return value is null.
  2. If removing @SOAPBinding(style=SOAPBinding.Style.RPC) from EchoImpl java file or inserting a non-holder parameter at the first place in holderOperation method, it will have return value.

Source: https://github.com/javaee/metro-jax-ws/issues/1224 Author: LanceAndersen