Hi Freeman,
I've attached a zip to the bug report. The zip contains a maven2
project demonstrating the bugs. I did not implement a client, but
something like soapUI is better for seeing these bugs anyway.
https://issues.apache.org/jira/browse/CXF-655
Thanks for your help!
-Chris
-----Original Message-----
From: Freeman Fang [mailto:[EMAIL PROTECTED]
Sent: Wednesday, May 16, 2007 4:01 AM
To: [email protected]
Subject: Re: Problems with String[] and List<String> in Java-First
Service
Hi Chris,
Yes, String[] as input/output paras both has problem if use Doc/Lit of
code first way.
I fill a jira to track it. https://issues.apache.org/jira/browse/CXF-655
And we will fix it asap.
Would you please try code first with rpc/lit mode if input or return is
String[] before we fix CXF-655 as work around, I just test it and it
works.
The sei class is
package org.apache.cxf.jaxws.service;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@SOAPBinding(style = SOAPBinding.Style.RPC, use =
SOAPBinding.Use.LITERAL)
@WebService(name = "Hello", targetNamespace = "http://mynamespace.com/")
public interface SayHi {
@WebMethod(operationName = "sayHi", exclude = false)
String[] getStringArray(String[] string);
}
The impl class should be
package org.apache.cxf.jaxws.service;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
@WebService(serviceName = "SayHiService",
portName = "HelloPort",
targetNamespace = "http://mynamespace.com/",
endpointInterface = "org.apache.cxf.jaxws.service.SayHi")
public class SayHiImpl implements SayHi {
public String[] getStringArray(String[] strs) {
String[] strings = new String[2];
strings[0] = "Hello" + strs[0];
strings[1] = "Bonjour" + strs[1];
return strings;
}
}
Also, would you please provide the code you are testing? I mean the SEI,
impl and mainline of server and client.
Thanks very much
Freeman
Christopher Moesel wrote:
I've been experimenting with Java-first services (for a friend ;) and
have run into some issues. I am using the latest version off svn HEAD
(the RC has its own set of issues w/ Java-first services). I can
break
it in several different and interesting ways.
(1) It appears that I cannot have a string array (String[]) as a
return
object for a @WebMethod. If I try, I get the following stacktrace
(just
beginning of it):
org.apache.cxf.interceptor.Fault: Marshalling Error:
[Ljava.lang.String;
is not known to this context
at
org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:
149)
...
(2) If I try to use a List<String> as the return object instead, then
there is no exception/fault, but the response does not validate
against
the schema. It adds the following complexType to the WSDL:
<xs:complexType final="#all" name="stringArray">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="item"
nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
But that context type is not referred to in the WSDL, as the response
wrapper is still defined like so:
<xsd:element name="echoStringListResponse"
type="echoStringListResponse"/>
<xsd:complexType name="echoStringListResponse">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="return"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
But an actual response from the service looks like this:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mysvc="http://myco.com/svc">
<soap:Body>
<echoStringListResponse xmlns=" http://myco.com/svc">
<ns3:return xmlns:ns3=" http://myco.com/svc"
xmlns:ns2="http://www.w3.org/2005/08/addressing/wsdl"
xmlns="http://myco.com/svc/types">
<item xmlns=""
xmlns:ns4="http://avid.com/xena/types">hello1</item>
<item xmlns=""
xmlns:ns4="http://avid.com/xena/types">hello2</item>
<item xmlns=""
xmlns:ns4="http://avid.com/xena/types">hello3</item>
</ns3:return>
</echoStringListResponse>
</soap:Body>
</soap:Envelope>
As you can probably see, there are a number of things wrong above:
- treats ns3:return like a stringArray type not unbounded xsd:string
- sets the namespace of the item elements to ""
- lots of redundant and unneeded namespace declarations
(3) If I have a service with one operation that returns String[] (like
#1 above) and one that returns List<String> (like #2 above), then #1
ceases to fail in the way it had before. Instead of throwing an
exception (as in #1), it now fails the same way #2 does-- by returning
a
response that is invalid against the schema (and looks like the
stringArray complex type that mysteriously appeared in the WSDL).
(4) Lastly, if an operation has a String array (String[]) as an input
parameter, then you get the following stack trace (beginning only):
java.lang.ClassCastException: java.lang.Class
at
org.apache.cxf.interceptor.DocLiteralInInterceptor.getPara(DocLiteralInI
nterceptor.java:219)
at
org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLite
ralInInterceptor.java:121)
...
For those of you who are now wondering, incidentally, using a
List<String> as an input parameter does seem to work correctly (aside
from unneeded namespace declarations). So this particular problem is
only for String[].
Although I want to convince my friend to use WSDL-first anyway, I'd
rather that the argument NOT be "CXF can't do java-first right, so you
have to use WSDL-first". Because then they might use .NET. Yikes.
Anyone know of any workarounds or know of something I might be doing
wrong?
-Chris