Мул ESB с вводом массива - как мне использовать использование массива-точки входа-разрешения - PullRequest
1 голос
/ 06 октября 2011

У меня есть веб-сервис, который предоставляет несколько методов, принимающих массивы в качестве входных данных. Я определил поток, как требуется в файле mule-config.xml для моей реализации службы, и могу создать мой клиент WCF из WSDL, предоставляемого службой.

Если я пытаюсь вызвать один из этих методов, которые принимают массив в качестве входных данных от моего клиента, я получаю следующее исключение:

WARN  2011-10-06 13:38:02,139 [connector.http.mule.default.receiver.3] org.apache.cxf.phase.PhaseInterceptorChain: Interceptor for {http://api.data.ws.occ600.emsgt.com/}ConfigurationServiceService#{http://api.data.ws.occ600.emsgt.com/}create has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Component that caused exception is: DefaultJavaComponent{configurationService.commponent.32217869}. Message payload is of type: MapExtent[]
    at org.mule.module.cxf.MuleInvoker.invoke(MuleInvoker.java:85)
    at org.mule.module.cxf.MuleJAXWSInvoker.invoke(MuleJAXWSInvoker.java:47)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113)
    at org.mule.module.cxf.CxfInboundMessageProcessor.sendToDestination(CxfInboundMessageProcessor.java:288)
    at org.mule.module.cxf.CxfInboundMessageProcessor.process(CxfInboundMessageProcessor.java:129)
    at org.mule.module.cxf.config.FlowConfiguringMessageProcessor.process(FlowConfiguringMessageProcessor.java:50)
    at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:90)
    at org.mule.processor.SecurityFilterMessageProcessor.process(SecurityFilterMessageProcessor.java:77)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:88)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:90)
    at org.mule.processor.ExceptionHandlingMessageProcessor.process(ExceptionHandlingMessageProcessor.java:25)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:88)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:63)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:94)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:88)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:63)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:94)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:185)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:158)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:145)
    at org.mule.transport.http.HttpMessageReceiver$HttpWorker.doRequest(HttpMessageReceiver.java:247)
    at org.mule.transport.http.HttpMessageReceiver$HttpWorker.processRequest(HttpMessageReceiver.java:206)
    at org.mule.transport.http.HttpMessageReceiver$HttpWorker.run(HttpMessageReceiver.java:164)
    at org.mule.work.WorkerContext.run(WorkerContext.java:309)
    at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
    at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.mule.component.ComponentException: Component that caused exception is: DefaultJavaComponent{configurationService.commponent.32217869}. Message payload is of type: MapExtent[]
    at org.mule.component.DefaultComponentLifecycleAdapter.invoke(DefaultComponentLifecycleAdapter.java:359)
    at org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:86)
    at org.mule.component.AbstractJavaComponent.doInvoke(AbstractJavaComponent.java:77)
    at org.mule.component.AbstractComponent.invokeInternal(AbstractComponent.java:120)
    at org.mule.component.AbstractComponent.access$000(AbstractComponent.java:56)
    at org.mule.component.AbstractComponent$1$1.process(AbstractComponent.java:234)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:88)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:63)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:94)
    at org.mule.component.AbstractComponent.process(AbstractComponent.java:154)
    at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:90)
    at org.mule.processor.AsyncInterceptingMessageProcessor.process(AsyncInterceptingMessageProcessor.java:97)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:88)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:90)
    at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
    at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:90)
    at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
    at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:90)
    at org.mule.processor.AbstractFilteringMessageProcessor.process(AbstractFilteringMessageProcessor.java:41)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:88)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:63)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:89)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:94)
    at org.mule.construct.AbstractFlowConstruct$1$1.process(AbstractFlowConstruct.java:107)
    at org.mule.processor.AbstractInterceptingMessageProcessor.processNext(AbstractInterceptingMessageProcessor.java:90)
    at org.mule.module.cxf.CxfInboundMessageProcessor.processNext(CxfInboundMessageProcessor.java:328)
    at org.mule.module.cxf.MuleInvoker.invoke(MuleInvoker.java:80)
    ... 39 more
Caused by: org.mule.model.resolvers.EntryPointNotFoundException: Failed to find entry point for component, the following resolvers tried but failed: [
ArrayEntryPointResolver: Found too many possible methods on object "com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2" that accept parameters "{class [Lcom.emssatcom.occ600.dal.api.MapExtent;}", Methods matched are "[public final void com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2.delete(com.emsgt.data.api.EMSRecord[]) throws com.emssatcom.occ600.dal.api.DALException, public final com.emssatcom.occ600.dal.api.MapExtent[] com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2.create(com.emssatcom.occ600.dal.api.MapExtent[]) throws com.emssatcom.occ600.dal.api.DALException, public final void com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2.update(com.emssatcom.occ600.dal.api.MapExtent[]) throws com.emssatcom.occ600.dal.api.DALException, public final void com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2.createEx(com.emsgt.data.api.EMSRecord[]) throws com.emssatcom.occ600.dal.api.DALException, public final void com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2.updateOnly(com.emsgt.data.api.EMSRecord[]) throws com.emssatcom.occ600.dal.api.DALException, public final void com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2.updateOrInsert(com.emsgt.data.api.EMSRecord[]) throws com.emssatcom.occ600.dal.api.DALException]"
ReflectionEntryPointResolver: Could not find entry point on: "com.emsgt.occ600.ws.data.lib.ConfigurationServiceImpl$$EnhancerByCGLIB$$7277bad2" with arguments: "{class com.emssatcom.occ600.dal.api.MapExtent,class com.emssatcom.occ600.dal.api.MapExtent}"
]
    at org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:52)
    at org.mule.component.DefaultComponentLifecycleAdapter.invoke(DefaultComponentLifecycleAdapter.java:350)

После дальнейшего изучения я нашел решатель точки входа массива. Добавив это в мой мул-конфиг следующим образом

  <component>
           <entry-point-resolver-set>
                <reflection-entry-point-resolver/>
                <array-entry-point-resolver />
        </entry-point-resolver-set>

    <spring-object bean="myWebService"/>
</component> 

все равно не помогает. Есть опыт общения с кем-нибудь?

1 Ответ

0 голосов
/ 01 ноября 2011

Я решил использовать комбинацию решателей точек входа массива, решателей точек входа метода и изменения в сигнатуре API для решения этой проблемы. Проблема здесь в том, что Мул использует аргумент вызова веб-службы, чтобы определить, какой метод использовать вместо имени метода, даже если в его документации указано, что он использует кучу преобразователей, включая метод-entry-point-resolver.

Таким образом, если у вас есть интерфейс, который предоставляет два метода с разными именами, каждый из которых принимает один массив типа T, нет комбинации распознавателей, которая обеспечит вызов правильного метода. Не так далеко, как я мог сказать. Если вы укажете оба этих метода в коллекции method-entry-point-resolver следующим образом:

<method-entry-point-resolver>
                <include-entry-point method="method1"/>
                <include-entry-point method="method2"/> 
            </method-entry-point-resolver>

Мул всегда вызывает method1, если входным аргументом является T [], игнорируя имя метода.

Если вы попробуете это:

<method-entry-point-resolver>
                <include-entry-point method="method1"/>                                         
            </method-entry-point-resolver>
            <array-entry-point-resolver>
               <include-entry-point method="method2"/>                 
            </array-entry-point-resolver> 

Мул все еще не вызывает правильный метод во все времена. В итоге я создал класс, который просто оборачивает T [] и изменил его в качестве входного аргумента на method1. Настроил method1 в наборе метода-точки-разрешения-точки входа, а метод2 в коллекции-точки-входа-точки-массива, и это работает.

Это, очевидно, проблема, но я не мог заставить парней MuleSoft ответить.

...