Ok, so I must use the explicit xsd file validation. I try it, but it does not
work for me.
Using the same classes I used in another question:
@Path("/luckynumbers")
public class LuckyNumbers {
@POST
@Path("/addRequest")
@Produces({MediaType.APPLICATION_XML})
@Consumes({MediaType.APPLICATION_XML})
public String addRequest(RequestWrapper rw) {
System.out.println(rw);
return rw.toString();
}
@XmlRootElement(name="requestWrapper", namespace="http://luckynumbers")
public static class RequestWrapper {
List<String> theList = new ArrayList();
String theRequest;
@XmlElement (name="listItem")
@XmlElementWrapper
public Collection<String> getTheList() {
return theList;
}
public void setTheList(List<String> theList) {
this.theList = theList;
}
@XmlAttribute(required=true)
public String getTheRequest() {
return theRequest;
}
public void setTheRequest(String theRequest) {
this.theRequest = theRequest;
}
@Override
public String toString() {
return "RequestWrapper{" +
"theList=" + theList +
", theRequest='" + theRequest + '\'' +
'}';
}
}
}
The xsd file (the content is copy from WADL, saved as
/WEB-INF/schemas/LuckyNumbersRest.xsd. theRequest is required attribute):
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified" elementFormDefault="unqualified">
<xs:complexType name="requestWrapper">
<xs:sequence>
<xs:element minOccurs="0" name="theList">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0"
name="listItem" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="theRequest" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://luckynumbers" attributeFormDefault="unqualified"
elementFormDefault="unqualified" targetNamespace="http://luckynumbers">
<xs:import namespace=""/>
<xs:element name="requestWrapper" type="requestWrapper"/>
</xs:schema>
The jaxrs configure in beans.xml:
<jaxrs:server id="luckyNumbersRest"
serviceClass="prototype.rest.LuckyNumbers"
address="/LuckyNumbersRest">
<jaxrs:providers>
<ref bean="jaxbProvider" />
</jaxrs:providers>
</jaxrs:server>
<bean id="jaxbProvider"
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
<property name="schemaHandler" ref="schemaHolder"/>
<property name="marshallerProperties" ref="propertiesMap"/>
</bean>
<bean id="schemaHolder"
class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
<property name="schemas" ref="theSchemas"/>
</bean>
<util:list id="theSchemas">
<value>classpath:/WEB-INF/schemas/LuckyNumbersRest.xsd</value>
</util:list>
<util:map id="propertiesMap">
<entry key="jaxb.formatted.output">
<value type="java.lang.Boolean">true</value>
</entry>
</util:map>
Post XML data <prefix1:requestWrapper
xmlns:prefix1="http://luckynumbers"><theList><listItem>item1</listItem></theList></prefix1:requestWrapper>
without theRequest attribute, I expect the JAXB error like "theRequest must
appear on element requestWrapper", but this not happens, and the XML
response returns successfully: RequestWrapper{theList=[item1],
theRequest='null'}
Could you advice what may make the validation not work? The xsd file not
good, the jaxbprovider not configured well, others?
Thanks.
--
View this message in context:
http://cxf.547215.n5.nabble.com/How-to-enable-xml-schema-validation-for-CXF-Restful-web-service-tp4371287p4373720.html
Sent from the cxf-user mailing list archive at Nabble.com.