7
votes

HOWTO: Configurez Spring-WS pour publier des fichiers WSDL avec une URL de style '? WSDL'?

J'essaie de configurer le service de service Web à l'aide de Mule ESB.

Je tente de le faire à l'aide de WSProxService de Mule, mais après avoir progressé le code correspondant (avec le débogueur), il est clair que cette classe remplace les adresses de terminaux .

Le problème concerne les adresses Spring-WS WSDL sont du style http: //xxxx/xxxx.wsdl , mais wsproxystervice attend http: // xxxx / xxxx? wsdl ou http: // xxxx / xxxx & wsdl . Il remplace les adresses du point d'extrémité distantes avec l'adresse WSDL locale; Il coupe l'adresse WSDL distante au point de question I.E. '? WSDL' est destinée à être coupée, afin de créer le terme de recherche. Mais à cause du printemps-ws, cela ne fonctionne pas.

pour le casser:

wsproxyservice finit par essayer d'utiliser xxx < p> Pour remplacer xxx

avec xxx

qui échoue ... menant à un service de service Web réel Aller directement et non à travers le proxy.

a-t-il déjà remarqué / résolu ce problème ??

acclamations, Darren


3 commentaires

Désolé, changé "fonctionne" pour "ne fonctionne pas"


Le ? WSDL La convention de nommage est une .NET une. Si Mule insiste sur cette convention, elle se limite efficacement aux services Web .NET.


Absurdité. Mule est (apparemment) le système d'exploitation le plus populaire au monde ESB. C'est Java. Il utilise '?'. Axe, éventuellement le cadre Standard de Defacto WS en Java, utilise également le '?' convention. Et JAX-WS utilise également '?'. Je ne vis pas dans le monde .Net, donc je ne saurais pas ce que les conventions .Net sont. Néanmoins, Spring-WS est le premier cas pour moi où le WSDL est exposé avec autre chose qu'un "?".


4 Réponses :


1
votes

Ceci peut être applicable:

http://forum.springsource.org/showpost.php?p = 101967 & postcount = 4

Non, le? WSDL est un moyen d'obtenir un WSDL d'une classe. Dans SWS, un service n'est pas mis en œuvre comme une classe.


1 commentaires

Eh bien, il y a un soupçon de solution de contournement, mais vous perdriez alors toute la bonté dynamique du Springy - et j'ai déjà fait cela à la fin du mulet - pas vraiment une solution. Vraiment, je suis juste un peu déçu qu'il n'existe pas un attribut simple sur un élément qui déclare l'utilisation d'un "?".



5
votes

Que diriez-vous d'un filtre de servlet devant le servlet Spring WS qui vérifie l'URL et les paramètres?

En cas de correspondance, vous renvoyez le WSDL, sinon vous laissez la demande comme si rien ne s'est passé.

Cela devrait être trivial à mettre en œuvre et remplira votre besoin, si vous devez absolument avoir l'URL du WS +? WSDL annexé à celui-ci.

Voici le code: xxx


0 commentaires

0
votes

Vous pouvez créer une classe qui implémente filtre , créer dofilter méthode qui intercepte la demande et obtenez l'URL si elle se termine par "wsdl" , puis transmettez la demande d'URL par défaut de ressort ". WSDL" Nettoyage de la chaîne de requête. Quelque chose comme ceci: xxx


0 commentaires

1
votes

Vous pouvez également utiliser un HTTPServletReQuestWrapper pour gérer l'extension WSDL et permettre au serveur de gérer la demande:

@Component
public class WsdlQuestionMarkSuffixFilter implements javax.servlet.Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        if ("wsdl".equalsIgnoreCase(httpRequest.getQueryString())) {
            HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {
                @Override
                public String getQueryString() {
                    return null;
                }

                @Override
                public String getRequestURI() {
                    return super.getRequestURI() + ".wsdl";
                }
            };
            chain.doFilter(requestWrapper, response);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {

    }
}


0 commentaires