7
votes

Obtenir l'URL d'un point final CXF

Situation

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: xxx

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.

but

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".< xxx

Mais le résultat est juste xxx

Comment puis-je obtenir l'URL complète? Y a-t-il un moyen sans la construire seul?


0 commentaires

3 Réponses :


2
votes

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


0 commentaires

1
votes

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;
        }


0 commentaires

1
votes

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 endpoint.getaddress () donne simplement un nom de service au lieu de toute l'URL. Voici ma raison:

examinons une adresse de point final attendue: http://domain.com/tomcat-context / CXFServillet-motif / test

CXF Runtime exécute sur le conteneur de servlet. Les deux parties du milieu ( tomcat-context-context / cxfservlet-motif ) sont réellement gérées par un récipient de servlet et pourraient être extraites de servleContext . Vous pouvez implémenter org.springframework.web.context.servletcontextware au printemps. La dernière partie ( test qui est le nom du service) est gérée par CXF et peut être récupérée par endpoint.getaddress () .mais la première partie qui est schéma : // hôte: port 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 ou https://doman.com 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.

htth


0 commentaires