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. As an alternative, we can use the operationName and the wrapped Object as parameters for the invoke operation... Am I right? I'm not 100% sure that I got it understood.... but very grateful, anyway. 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 >
