“Nome de arquivo duplicado” para o mesmo namespace do WSDL ao usar o serviço da web de diferentes subdomínios

Prefácio

Estamos fornecendo aos clientes nossa API de serviço.

Cada cliente tem seu próprio subdomínio (por exemplo, sergii.ourwebsite.com) e possui o URL do WSDL.http://sergii.ourwebsite.com/api/bsapi.cfc?wsdl

Além disso, todos os sites (incluindo API, é claro) usando o mesmo código base.


Problema

Diga, dois aplicativos no mesmo servidor CF. Isso pode acontecer facilmente, porque alguns dos sites dos clientes estão hospedados em nossos servidores.

Ambos tentando usar o próprio WSDL da API, digamos:

http://sergii.ourwebsite.com/api/bsapi.cfc?wsdl
http://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl

E aqui vem os problemas.

Quando o segundo site tenta registrar o serviço da web, o CF lança um erro:

Nome:https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. WSDL:https://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl. org.apache.axis.wsdl.toJava.DuplicateFileException: Nome do arquivo duplicado: /opt/coldfusion8/stubs/WS1985941973/api/Bsapi.java. Dica: você pode ter mapeado dois namespaces com elementos de mesmo nome para o mesmo nome de pacote. Recomenda-se usar um navegador da Web para recuperar e examinar o documento WSDL solicitado para garantir que esteja correto. Se o documento WSDL solicitado não puder ser recuperado ou gerado dinamicamente, é provável que o serviço da web de destino tenha erros de programação.

O problema é que ambos estão usando o mesmo namespace do WSDL, construído a partir do caminho do CFC:

<wsdl:definitions targetNamespace="http://api">


Solução atual

A única solução de trabalho para nós é usar os aliases do CFC, como:

http://galashyn.ourwebsite.com/api/v1n1/bsapi.cfc?wsdl
http://galashyn.ourwebsite.com/api/v1n1/bsapi.cfc?wsdl

Cada este CFC estende o pai como este:

<cfcomponent output="false" extends="api.bsapi">
<!--- this component used to extend base api version 1.x --->
</cfcomponent>

Eles produzem namespaces diferentes, que podem ser usados ​​sem problemas - namespace próprio para cada aplicativo:

<wsdl:definitions targetNamespace="http://v1n1.api">
<wsdl:definitions targetNamespace="http://v1n2.api">


Esta é uma solução bastante burra, mas funciona por enquanto.


Outra solução seria usar o subdomínio da única API e identificar os clientes por alguma chave (já estamos usando-os para fins de segurança), mas isso tem sérios problemas negativos para nós por causa de algum código legado.


Por favor note que eu não conheço Java, muitos conselhos específicos não são tão claros para mim.

O Google mostra que esse problema existe há anos, mas não consigo encontrar a solução inteligente.

Então talvez aqui?

questionAnswers(4)

yourAnswerToTheQuestion