Preciso desenvolver um cliente que possa fazer invocação dinâmica para diferentes web services que possuem o mesmo contrato sendo diferenciados apenas pela URL e pelo targetNamespace. Tentei a seguinte implementação com o JAX-WS (não estou certo se esse possui suporte a esse tipo de invocação “dinâmica”)
//os parâmetros são fictícios para ilustração
javax.xml.ws.Service s = Service.create(new java.net.URL(http://localhost:7001/servico?WSDL),
new javax.xml.namespace.QName("http://targetName", "tagServiceNameWSDL");
InterfaceWS ws = (IntefaceWS) s.getPort(new javax.xml.namespace.QName("http://targetName", "tagPortNameWSDL"), InterfaceWS.class);
Response response = ws.invocaServicoWS(arg0, arg1);
Porém a interface (InterfaceWS no exemplo acima) possui as seguintes anotações
@WebMethod(operationName = "SendTextMessageProvider")
@WebResult(name = "Response", targetNamespace = "http://xpto.com.br/")
@RequestWrapper(localName = "SendTextMessageProvider", targetNamespace = "http://xpto.com.br/", className = SendTextMessage")
@ResponseWrapper(localName = "SendTextMessageResponse", targetNamespace = "http://xpto.com.br/", className = SendTextMessageResponse")
public Response invocaServico (
@WebParam(name = "Request", targetNamespace = "http://xpto.com.br/")
TextMessage request);
Se eu removo as ref. ao tagetNamespace das anotações @WebResult e @WebPram recebo exceptions JAX-B Exception pois ele não consegue resolver os nomes para Request e Response, o interessante é se apago o arquivo package-info.java os parâmetros passam a serem reconhecidos.
Removendo as ref. ao targetNamespace das anotações @RequestWrapper e @ResponseWrapper recebo uma javax.xml.ws.soap.SOAPFaultException: Cannot find dispatch method for …
Para invocações aonde o contrato exposto (WSDL) possui o mesmo targetNamespace não há problemas. Para invocações para o contratos idênticos com outro targetNamespace preciso alterar as anotações e ainda o arquivo package-info.java.
Por favor, ignorem quaisquer erros nos códigos acimas, são apenas exemplos para eu tentar ilustrar melhor o meu problema.
Seria uma opção para invocação dinâmica usar o CFX, SAAJ ou há alguma forma de conseguir com o JAX-WS, ou isso não é possível?
Obrigado.