On Tuesday 17 August 2010 1:59:41 am Alex Labad wrote: > WOW, like a charm!!! > > Thanks, really really thanks. I have been trying for a long time before > crying for help!!! > > so.. summing up: > > when using BOI, the wrapped form is required.
No, when using the BOI, you need to use the from that the BOI is in. If you would have done: boi = boi.getUnwrappedOperation() to get the unwrapped BOI, then it probably would have also worked. By default, the BOI's returned from the BindingInfo would be the wrapped form (as it appears in the WSDL). To use the unwrapped form, you would need to pull that out. > As an alternative, we can use > the operationName and the wrapped Object as parameters for the invoke > operation... When using the operation name, it would use the form that normal "wsdl2java" would have generated. In this case, it would be the unwrapped form. However, the client DOES have invokeWrapped(name, ..) if you want to force it to use the wrapped version. > Am I right? I'm not 100% sure that I got it understood.... but very > grateful, anyway. Hope the above helps. Dan > > > > > > 2010/8/16 Daniel Kulp <[email protected]> > > > I THINK your calls into the opInfo around: > > if (!operationToBeInvoked.isUnwrapped()) { > > > > may be confusing things. If passing the BindingOperationInfo into the > > invoke, > > you have to use the input message for the BOI, not it's unwrapped form. > > > > To check this, change the line: > > clientImpl.invoke(operationToBeInvoked, myObject); > > to > > clientImpl.invoke("objectInput", myObject); > > and see if that helps at all. > > > > > > Dan > > > > On Thursday 12 August 2010 8:13:05 am Alex Labad wrote: > > > Hi all! > > > > > > > > > > > > I have a weird problem with cxf invoking external services: I can > > > handle the simple ones through the simple DynamicClientFactory, > > > generating the Client and invoking the services, it is ok. > > > > > > > > > > > > The problem comes with the Object parameters: > > > > > > In this case, the client generates the Beans, I fill them through > > > introspection, check the values as well, but when sending the > > > parameter, > > > > in > > > > > the server, it just receives an empty bean... > > > > > > > > > > > > Calling it from SoapUI, it works perfectly > > > > > > Calling from java: It doesn’t reveive anything (it receives a > > > SimpleBean, but null when calling the getName or getSurname). > > > > > > Any help? Ideas? Will be veeeery welcome!!! (Thanks in advance!!!!) > > > > > > > > > > > > Easier with the code? Here it is: (Attached is the WSDL) > > > > > > > > > > > > The Service: I did it with Axis2, for dynamic client testing . Where > > > SimpleBean is just a POJO with name and surname attributes, and their > > > getter and setters. > > > > > > > > > > > > *public* String secondObject(SimpleBean simpleBean) { > > > > > > *if* (simpleBean != *null*) { > > > > > > *if* (simpleBean *instanceof* SimpleBean) { > > > > > > System.*out*.println("ES UNA simpleBean BEAN"); > > > > > > System.*out*.println("name: " +simpleBean.getName()); > > > > > > System.*out*.println("surname: > > > "+simpleBean.getSurname()); > > > > > > } > > > > > > *return* simpleBean.getName() + " ------------ " + > > > > > > simpleBean.getSurname(); > > > > > > } > > > > > > *return* "No input provided"; > > > > > > } > > > > > > And the JavaCode to call to the service > > > > > > > > > > > > JaxWsDynamicClientFactory factory = > > > > JaxWsDynamicClientFactory.*newInstance* > > > > > (); > > > > > > String methodName=”secondObject”; > > > > > > List<String> bindingFiles = *new* ArrayList<String>(); > > > > > > bindingFiles.add("javabindings.xml"); > > > > > > Client clientImpl = factory.createClient(wsdlUrl, > > > > Thread.* > > > > > currentThread*().getContextClassLoader(), bindingFiles); > > > > > > Endpoint endpoint = clientImpl.getEndpoint(); > > > > > > ServiceInfo serviceInfo = > > > > > > endpoint.getService().getServiceInfos().get(0); > > > > > > QName bindingName = *null*; > > > > > > *for* (BindingInfo binfo : serviceInfo.getBindings()) > > > { > > > > > > *if* (binfo.getName().getLocalPart().indexOf( > > > > > > "Soap11") > -1) { > > > > > > bindingName = binfo.getName(); > > > > > > } > > > > > > } > > > > > > > > > > > > BindingInfo binding = > > > > > > serviceInfo.getBinding(bindingName); > > > > > > BindingOperationInfo operationToBeInvoked = *null*; > > > > > > *for* (BindingOperationInfo operation : > > > binding.getOperations()) { > > > > > > > > > *if*(methodName.equals(operation.getName().getLocalPart())) { > > > > > > operationToBeInvoked = operation; > > > > > > } > > > > > > } > > > > > > > > > > > > *if* (operationToBeInvoked == *null*) { > > > > > > *throw* *new* > > > NoSuchMethodException(methodName); > > > > > > } > > > > > > > > > > > > System.*out*.println("Invoke, operation info: " + > > > > > > operationToBeInvoked ); > > > > > > BindingMessageInfo inputMessageInfo; > > > > > > > > > > > > *if* (!operationToBeInvoked.isUnwrapped()) { > > > > > > //Operation uses document literal wrapped > > > style. > > > > > > inputMessageInfo = > > > > > > operationToBeInvoked.getWrappedOperation().getInput(); > > > > > > } *else* { > > > > > > inputMessageInfo = > > > > > > operationToBeInvoked.getUnwrappedOperation().getInput(); > > > > > > } > > > > > > > > > > > > List<MessagePartInfo> parts = > > > > > > inputMessageInfo.getMessageParts(); > > > > > > *if* (parts.isEmpty()) { > > > > > > System.*out*.println("parts is empty. No > > > message > > > > !" > > > > > ); > > > > > > } *else* { > > > > > > MessagePartInfo partInfo = parts.get(0); // > > > Input > > > > > > class is Order > > > > > > // Get the input class Order > > > > > > Class<?> param1Class = partInfo.getTypeClass(); > > > > > > > > > > > > System.*out*.println("param1 is of Type: " + > > > > > > param1Class.getCanonicalName()); > > > > > > Object myObject = *create* > > > > > > (param1Class.getCanonicalName()); > > > > > > Method theMethod = > > > > > > myObject.getClass().getMethod("setTask", String.*class*); > > > > > > theMethod.invoke(myObject, "value1"); > > > > > > Method theDayMethod = > > > > > > myObject.getClass().getMethod("setTheDay", String.*class*); > > > > > > theDayMethod.invoke(myObject, "value2"); > > > > > > System.*out*.println("Testing the > > > > income."); > > > > > Method getter1 = > > > > > > myObject.getClass().getMethod( "getTask", *null*); > > > > System.*out*.println(getter1.invoke(myObject, > > > > > * null*)); > > > > > > Method getter2 = > > > > > > myObject.getClass().getMethod( "getTheDay", *null*); > > > > System.*out*.println(getter2.invoke(myObject, > > > > > * null*)); > > > > > > Object[] response = > > > > > > clientImpl.invoke(operationToBeInvoked, myObject); > > > > > > *return* *parseResponse*(response); > > > > > > } > > > > -- > > Daniel Kulp > > [email protected] > > http://dankulp.com/blog -- Daniel Kulp [email protected] http://dankulp.com/blog
