Hello,
We developed a JAX-WS service with JAXB annotations on our data types. We
have been running it through the Endpoint class using the JAXB
implementation bundled with the JDK for 6 months. I am trying to switch to
Tomcat with Axis2. I have developed a services.xml as below, and I can see
axis2 generating a WSDL. I have made no changes to the annotations or
anything, but am seeing very strange results in the WSDL for the XSD types.
Here is an example: I have a JAXB annotated class as:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "searchTermType", propOrder = {
"fields"
})
public class SearchTerm {
@XmlElement(name = "field", required = true)
private List<String> fields = Lists.newArrayList();
public SearchTerm(String... strings) {
this(Arrays.asList(strings));
}
public SearchTerm(List<String> fields) {
this.fields = fields;
}
public List<String> getFields() {
return fields;
}
public String getFieldsAsString() {
return StringUtils.join(getFields(), ",");
}
public void setFields(List<String> fields) {
this.fields = fields;
}
public boolean isValid() {
for (String s : fields) {
if (StringUtils.isNotBlank(s))
return true;
}
return false;
}
}
In JAXB RI I get (as expected) since I have marked the @XmlAccessorType as
Field -- I get a schema like:
<xs:complexType name="searchTermType">
<xs:sequence>
<xs:element name="field" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
Note that the getFieldAsString and isValid getters are not included in the
schema.
Unfortunately, in Axis2 I get:
<xs:complexType name="SearchTerm">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="fields"
nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="fieldsAsString" nillable="true"
type="xs:string"/>
<xs:element minOccurs="0" name="valid" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
which has included the getters -- even though I have the @XmlAccessorType as
field. Also in general the schemas it generated are completely different --
its wrapped things in a more nested structure than the JAXB RI and used so
xs:anyType types in places -- Im just lost at how it is generating things so
differently. So is the JAXB Provider configurable? Can I not just
configure it to use the one bundled with the JRE? Any thoughts?
P.S. Here is my services.xml:
<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
<service name="FuzzySearchService">
<description>FuzzySearch user service</description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.jaxws.server.JAXWSMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.jaxws.server.JAXWSMessageReceiver" />
</messageReceivers>
<!-- spring injection of the service from servlet context -->
<parameter
name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
</parameter>
<parameter name="SpringBeanName">fuzzySearchServerService</parameter>
</service>
<service name="FuzzySearchAdminService">
<description>FuzzySearch admin service</description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.jaxws.server.JAXWSMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.jaxws.server.JAXWSMessageReceiver" />
</messageReceivers>
<!-- spring injection of the service from servlet context -->
<parameter
name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
</parameter>
<parameter
name="SpringBeanName">fuzzySearchAdminServerService</parameter>
</service>
</serviceGroup>
Thanks,
Steve