Какова точка входа в сгенерированный CXF веб-сервис?
Используя первый контрактный подход, я сгенерировал веб-сервис из WSDL, используя CXF.
Tomcat 7 прекрасно загружает веб-сервис и правильно реагирует на сообщения SOAP.
Но хотя я понимаю автоматически сгенерированные классы Java из WSDL и XSD, я не уверен, что знаю, где находится точка входа (так что, например, я могу включить проверку).
Поскольку знакомый метод main() является только точкой входа по умолчанию и не является обязательным, я предполагаю, что CXF использует другую точку входа для этой цели.
Когда я создаю веб-сервис (используя pom.xml, который содержит плагин CXF), генерируются только 2 пакета (достаточно для создания работающего веб-сервиса):
- Один для самого WSDL, содержащий только 3 модуля Java: ObjectFactory.java, MyBinding.java, MyService.java
- Второй - для схемы XSD, содержащей класс Java для каждого типа, определенного в схеме.
Я подозреваю, что MyService.java, который расширяет класс с именем Service
где я должен искать эту точку входа. Но как это делает "волшебство"?
Кстати, я попытался выяснить это с консоли Tomcat, но это все журналы веб-службы при запуске:
Oct 4, 2013 11:27:47 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
Oct 4, 2013 11:27:47 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Fri Oct 04 11:27:47 EDT 2013]; root of context hierarchy
Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [beans.xml]
Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [META-INF/cxf/cxf.xml]
Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [META-INF/cxf/cxf-extension-soap.xml]
Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [META-INF/cxf/cxf-servlet.xml]
Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@17392df: defining beans [org.springframework.context.
annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.anno
tation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,cxf,org.apache.cxf.bus.spring.BusWiringBeanF
actoryPostProcessor,org.apache.cxf.bus.spring.Jsr250BeanPostProcessor,org.apache.cxf.bus.spring.BusExtensionPostProcessor,org.apache.cxf.binding.soap.SoapBindin
gFactory,org.apache.cxf.binding.soap.SoapTransportFactory,org.apache.cxf.binding.soap.customEditorConfigurer,myserviceWS,myserviceBinding]; root of factor
y hierarchy
Oct 4, 2013 11:27:47 AM org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
INFO: Creating Service {http://myws.example.com/ns}MyService from WSDL: file:/C:/Users/Daniel/myws/src/main/wsdl/myws.wsdl
Oct 4, 2013 11:27:48 AM org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the server's publish address to be /myservice/soap
Oct 4, 2013 11:27:48 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 1107 ms
CXF, кажется, очень хорошо скрывает детали реализации, но я хотел бы знать, где подключить мою настройку инициализации.
1 ответ
CXFServlet обычно является точкой входа для вашего сервиса. Tomcat направляет HTTP-запрос в ваше веб-приложение, а отображение сервлета определяет сервлет, который получает запрос. Если вы хотите перехватить запрос до того, как он достигнет CXF, вы можете написать Servlet Filter.
Для простых нужд проверки CXF поддерживает проверку схемы через конфигурацию.
Если вы хотите сделать что-то более необычное с сообщением до того, как оно достигнет вашего сервиса, и воспользоваться функциональностью CXF, я бы порекомендовал ознакомиться с перехватчиками CXF. Они очень мощные и могут перехватывать сообщение на любом количестве этапов, прежде чем оно достигнет службы и выйдет из службы. Документация CXF содержит подробную информацию об этапах и инструкции по написанию перехватчика.