[
http://jira.codehaus.org/browse/XFIRE-777?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_122778
]
bartolomeo sorrentino commented on XFIRE-777:
---------------------------------------------
I've downloaded the ServiceInvocationHandler.java in attach but it seems not
work properly to marshal/unmarshal the INOUT parameter stored within header.
i've found a strange behaviour within method
private static XMLStreamReader getXMLStreamReader(AbstractMessage msg,
MessagePartInfo header
the statement s
QName name = header.getName();
Element el = msg.getHeader().getChild(name.getLocalPart(),
Namespace.getNamespace(name.getNamespaceURI()));
return always null also if the element exists
i've solved the problem adding the following method and call it instead of the
code above
private static Element findElement( Element header, QName name ) {
Element result = header.getChild(name.getLocalPart(),
Namespace.getNamespace(name.getNamespaceURI()));
if( null==result ) {
for( Element ee : (List<Element>)header.getChildren() ) {
if( ee.getName().equals(name.getLocalPart()) ) {
result = ee;
break;
}
}
}
return result;
}
> WebService (JSR181) with soap header as INOUT parameter
> -------------------------------------------------------
>
> Key: XFIRE-777
> URL: http://jira.codehaus.org/browse/XFIRE-777
> Project: XFire
> Issue Type: Bug
> Components: Core
> Affects Versions: 1.2.2
> Environment: Windows 2003, JBOSS 4.0.3SP1, XFire 1.2.2, String 2.0
> Reporter: Victor Trakhtenberg
> Assignee: Tomasz Sztelak
> Fix For: 1.2.5
>
> Attachments: ServiceInvocationHandler.java, XFireProblem.war,
> XFireProblem.zip
>
>
> I'm developing web service using XFire,Spring JSR181 implementation.
> I need to use SOAP header in mode INOUT.
> I've define the following operation in web service interface:
> @WebMethod(operationName = "op")
> @WebResult(name = "opRes")
> public String op(@WebParam(name = "ws_header", header = true, mode =
> WebParam.Mode.INOUT)Holder<SessionInfoHeader> ws_header);
> The implementation is simple it just prints some string.
> (see attached ServiceAWS.java,ServiceAImpl.java)
> The problem is that I have a following exception:
> Please see attache the eclipse project XFireProblem.zip the war as it was
> deployed in JBoss.
> I've used the client: com.jacada.ServiceAClient
> the exception is:
> java.lang.IllegalArgumentException: wrong number of arguments
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.lang.reflect.Method.invoke(Unknown Source)
> at
> org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:54)
> at
> org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:271)
> at
> org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:84)
> at
> org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:132)
> at
> org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:107)
> at
> org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
> at
> org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
> at
> org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
> at
> org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:301)
> at
> org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:130)
> at
> org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
> at
> org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
> at
> org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39)
> at
> org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:159)
> at
> org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
> at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
> at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
> at
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
> at
> org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
> at java.lang.Thread.run(Unknown Source)
> java.lang.IllegalArgumentException: wrong number of arguments
> (I will provide the stack trace later).
> I saw in org.codehaus.xfire.service.binding.ServiceInvocationHandler class in
> protected Object[] fillInHolders(MessageContext context,OperationInfo opInfo,
> MessageInfo inMsg, MessageInfo outMsg, MessagePartContainer headerMsg,
> MessagePartContainer outHeaderMsg, List params) method calculation of the
> number of the parameters:
> int outSize = 0;
> if (outMsg != null)
> {
> outSize = outHeaderMsg.size() + outMsg.size();
> if (outSize != 0) outSize--;
> }
> int total = inMsg.size() + headerMsg.size() + outSize;
> In my case for method "op" which takes only one parameter (the header) the
> value of total is 2.
> Later the allocated array
> Object[] newParams = new Object[total];
> used in Java reflection to find the method, BUT there's no method with 2
> parameters, but only with one parameter.
> So it seems that there's a bug here.
> I don't understand why does outSize participates in calculation of total.
> Would it be correct to make the line:
> int total = inMsg.size() + headerMsg.size();
> May the problem in some other place.
>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email