JBoss Fuse и CXF: Изменение в механизме выдачи wsdl файла веб-сервиса

У заказчика возникла просьба запретить или ограничить раздачу wsdl файла веб-сервиса. В случае с JBoss Fuse, работу с веб-сервисами обеспечивает Apache CXF. Доступ к wsdl файлу осуществляется http запросом вида: http://localhost:8195/cxf/services/test_emdev?wsdl. Порывшись немного в исходниках выяснилось, что за отправку wsdl клиенту отвечает интерсептор WSDLGetInterceptor.java. Далее необходимо было понять как влезть в цепочку вызовов стандартных интерсепторов. Не вдаваясь глубоко в поиски решения, пришли к тому, чтобы сделать слушатель событий, который срабатывает на создание объекта camel-context(его инициализация в контексте Spring).  Для этого надо имплементировать интерфейс org.apache.camel.support.EventNotifierSupport и определить метод notify. В этом методе получить объект CamelContext, в цикле перебрать все маршруты из него и проверить объект Consumer для каждого маршрута. Если этот объект типа CxfConsumer, то можно напрямую оперировать с интерсепторами через него. Ниже привожу содержание метода notify:

@Override

    public void notify(EventObject event) throws Exception {

        try {

            if (event instanceof CamelContextStartedEvent) {

            CamelContext cContext = ((CamelContextStartedEvent) event).getContext();

            List<Route> routes = cContext.getRoutes();

            for (Route route : routes) {

            Consumer cons = route.getConsumer();

            if (cons instanceof CxfConsumer) {

            ((CxfConsumer) cons).getServer().getEndpoint().getInInterceptors().remove(WSDLGetInterceptor.INSTANCE);

            }

            }

            }

            if (event instanceof CamelContextStoppingEvent) {

                //do nothing

            }

        } catch (Exception e) {

            LOG.error("Problem happened: ", e);

        }

    }

 

03.04.2017