Je déplouve des services Web avec Apache CXF 2.6.2 sur un serveur Tomcat. J'exporte les services à l'aide du cxfservlet et de la configuration à ressort suivante: p> dans mon exemple de déploiement Le CXFServlet utilise le chemin / service relatif et, par exemple, le service Web. Mise en œuvre par la classe TestImpl est disponible en tant que http://domain.com/tomcat-context/services/test < / a>
La classe Testbean a un régleur de point final et il est défini par le ressort. P> Je souhaite déterminer l'adresse (URL) fournie par le point de terminaison Test_endPoint dans la classe Testbean en utilisant le champ de terminaison. Le résultat devrait être excédément "http://domain.com/tomcat-context/services/test".< Mais le résultat est juste p> Comment puis-je obtenir l'URL complète? Y a-t-il un moyen sans la construire seul? P> h1> but h1>
3 Réponses :
Avez-vous essayé de piquer autour du message CXF pour voir si c'est dans l'une des propriétés? J'utilise Camel avec CXF et obtenez le message CXF actuel comme celui-ci:
org.apache.cxf.request.url=someDomain/myURL
Vous pouvez construire l'URL avec le code suivant. Et vous pouvez modifier le cas échéant dans votre environnement.
String requestURI = (String) message.get(Message.class.getName() + ".REQUEST_URI"); Map<String, List<String>> headers = CastUtils.cast((Map) message.get(Message.PROTOCOL_HEADERS)); List sa = null; String hostName=null; if (headers != null) { sa = headers.get("host"); } if (sa != null && sa.size() == 1) { hostName = "http://"+ sa.get(0).toString()+requestURI; }
J'ai eu les mêmes exigences. Cependant, je pense qu'il est impossible de récupérer l'hôte et le port de la définition du noeud final. Et comme vous l'avez mentionné, le examinons une adresse de point final attendue: http://domain.com/tomcat-context / CXFServillet-motif / test p>
CXF Runtime exécute sur le conteneur de servlet. Les deux parties du milieu ( htth p> endpoint.getaddress () code> donne simplement un nom de service au lieu de toute l'URL. Voici ma raison: p>
tomcat-context-context / cxfservlet-motif CODE>) sont réellement gérées par un récipient de servlet et pourraient être extraites de
servleContext code>. Vous pouvez implémenter
org.springframework.web.context.servletcontextware code> au printemps. La dernière partie (
test code> qui est le nom du service) est gérée par CXF et peut être récupérée par
endpoint.getaddress () code> .mais la première partie qui est
schéma : // hôte: port code> est au-delà de tout cela et il est contrôlé par la configuration de l'hôte. Par exemple, votre service pourrait recevoir une demande à la fois à un
http:/domain.com code> ou
https://doman.com code> et cxf runtime ne le sait jamais lorsque des services sont déployés . Toutefois, lorsque la demande est arrivée, elle pourrait être extraite de la demande ou du message comme prévu dans les postes d'autres. P>