cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Redko (Confluence)" <conflue...@apache.org>
Subject [CONF] Apache CXF Documentation > ValidationFeature
Date Tue, 03 Dec 2013 22:18:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/en/2176/1/1/_/styles/combined.css?spaceKey=CXF20DOC&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/CXF20DOC/ValidationFeature">ValidationFeature</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~reta">Andrew
Redko</a>
    </h4>
        <br/>
                         <h4>Changes (2)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >} <br> <br></td></tr>
            <tr><td class="diff-changed-lines" ><span class="diff-changed-words">{code<span
class="diff-deleted-chars"style="color:#999;background-color:#fdd;text-decoration:line-through;">:java</span>}</span>
<br></td></tr>
            <tr><td class="diff-unchanged" > <br> <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" > <br>Following the similar approach
as for JAXRSServerFactoryBean, in case of Spring respective bean definitions should be added
under &lt;jaxrs:outInterceptors&gt;, &lt;jaxrs:inInterceptors&gt; and &lt;jaxrs:providers&gt;
sections, f.e.: <br></td></tr>
            <tr><td class="diff-changed-lines" ><span class="diff-changed-words">{code<span
class="diff-added-chars"style="background-color: #dfd;">:xml</span>}</span>
<br></td></tr>
            <tr><td class="diff-unchanged" >&lt;jaxrs:server address=&quot;/&quot;&gt;
<br>    &lt;jaxrs:inInterceptors&gt; <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <p><span style="font-size:2em;font-weight:bold"> Bean Validation Feature
</span></p>

<div>
<ul>
    <li><a href='#ValidationFeature-Introduction'>Introduction</a></li>
    <li><a href='#ValidationFeature-Dependencies'>Dependencies</a></li>
<ul>
    <li><a href='#ValidationFeature-UsingHibernateValidatorasbeanvalidationprovider'>Using
Hibernate Validator as bean validation provider</a></li>
    <li><a href='#ValidationFeature-UsingApacheBValasbeanvalidationprovider'>Using
Apache BVal as bean validation provider</a></li>
</ul>
    <li><a href='#ValidationFeature-CommonBeanValidation1.1Interceptors'>Common
Bean Validation 1.1 Interceptors</a></li>
<ul>
    <li><a href='#ValidationFeature-Configuration'>Configuration</a></li>
</ul>
    <li><a href='#ValidationFeature-BeanValidation1.1andJAXRS2.0'>Bean Validation
1.1 and JAX-RS 2.0</a></li>
<ul>
    <li><a href='#ValidationFeature-ConfiguringBeanValidation1.1usingJAXRSServerFactoryBean'>Configuring
Bean Validation 1.1 using JAXRSServerFactoryBean</a></li>
    <li><a href='#ValidationFeature-ConfiguringBeanValidation1.1usingSpringbeandefinitionsXML'>Configuring
Bean Validation 1.1 using Spring bean definitions XML</a></li>
    <li><a href='#ValidationFeature-ValidationExceptionsandHTTPstatuscodes'>Validation
Exceptions and HTTP status codes</a></li>
</ul>
    <li><a href='#ValidationFeature-Examples'>Examples</a></li>
<ul>
    <li><a href='#ValidationFeature-Validatingsimpleinputparameters'>Validating
simple input parameters</a></li>
    <li><a href='#ValidationFeature-Validatingcomplexinputparameters'>Validating
complex input parameters</a></li>
    <li><a href='#ValidationFeature-Validatingreturnvalues%28nonResponse%29'>Validating
return values (non-Response)</a></li>
    <li><a href='#ValidationFeature-Validatingreturnvalues%28Response%29'>Validating
return values (Response)</a></li>
</ul>
    <li><a href='#ValidationFeature-BeanValidationandSchemaValidation'>Bean Validation
and Schema Validation</a></li>
</ul></div>

<h1><a name="ValidationFeature-Introduction"></a>Introduction</h1>

<p>Bean Validation 1.1 (JSR-349), an evolution of Bean Validation 1.0 (JSR-303), introduces
declarative constraints (based on Java annotations) to define the expectations for:</p>
<ul class="alternate" type="square">
	<li>properties of Java Beans</li>
	<li>method and constructor parameters</li>
	<li>method return values</li>
</ul>


<p>For example:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
public class Person {
    @NotNull private String firstName;
    @NotNull private String lastName;
    @Valid @NotNull private Person boss;

    public @NotNull String saveItem( @Valid @NotNull Person person, @Max( 23 ) BigDecimal
age ) {
        // ...
    }
}
</pre>
</div></div>

<p>Bean Validation API has been part of JPA 2.0 (JSR-317) and has proven to be successful
and very useful, helping developers to delegate routine validation tasks to the solid, very
extensible framework. It is very easy to create own constraints, including complex cross-field
ones.</p>

<h1><a name="ValidationFeature-Dependencies"></a>Dependencies</h1>
<p>Bean Validation support in Apache CXF is implementation-independent and is built
solely using Bean Validation API. The required dependencies are:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
&lt;dependency&gt;
    &lt;groupId&gt;javax.validation&lt;/groupId&gt;
    &lt;artifactId&gt;validation-api&lt;/artifactId&gt;
    &lt;version&gt;1.1.0.Final&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;javax.el&lt;/groupId&gt;
    &lt;artifactId&gt;javax.el-api&lt;/artifactId&gt;
    &lt;!-- use 3.0-b02 version for Java 6 --&gt;
    &lt;version&gt;3.0.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.glassfish&lt;/groupId&gt;
    &lt;artifactId&gt;javax.el&lt;/artifactId&gt;
    &lt;!-- use 3.0-b01 version for Java 6 --&gt;
    &lt;version&gt;3.0.0/version&gt;
&lt;/dependency&gt;
</pre>
</div></div>

<p>A couple of API implementations is available. Please note that if no implementation
is detected on the runtime class-path then the constraints validation won't have any effect.
</p>

<h2><a name="ValidationFeature-UsingHibernateValidatorasbeanvalidationprovider"></a>Using
Hibernate Validator as bean validation provider</h2>
<p><a href="http://www.hibernate.org/subprojects/validator.html" class="external-link"
rel="nofollow">http://www.hibernate.org/subprojects/validator.html</a></p>

<p>Hibernate Validator is a mature and feature-rich validation provider with the full
Bean Validation 1.1 support (as of version 5.x.x which is the reference implementation for
JSR 349 - Bean Validation 1.1 API). Add the following dependency:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
&lt;dependency&gt;
    &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
    &lt;artifactId&gt;hibernate-validator&lt;/artifactId&gt;
    &lt;version&gt;5.0.1.Final&lt;/version&gt;
&lt;/dependency&gt;
</pre>
</div></div>

<p>Hibernate Validator uses Java Expression Language 3.0 in order to provide better
validation messages support.  </p>

<h2><a name="ValidationFeature-UsingApacheBValasbeanvalidationprovider"></a>Using
Apache BVal as bean validation provider</h2>

<p><a href="http://bval.apache.org/" class="external-link" rel="nofollow">http://bval.apache.org/</a></p>

<p>Current stable version of Apache BVal (0.5) doesn't support Bean Validation 1.1 but
the upcoming 1.1.0 will have it fully implemented (at the moment 1.1.0-alpha-SNAPSHOT could
be used).</p>
<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent
panelContent">
<pre>&lt;dependency&gt;
    &lt;groupId&gt;org.apache.bval&lt;/groupId&gt;
    &lt;artifactId&gt;bval-jsr&lt;/artifactId&gt;
    &lt;version&gt;1.1.0-alpha-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;
</pre>
</div></div>

<h1><a name="ValidationFeature-CommonBeanValidation1.1Interceptors"></a>Common
Bean Validation 1.1 Interceptors</h1>

<p>JAX-RS and JAX-WS frontends can rely on the following common interceptors to get
Bean Validation 1.1 done:</p>

<ul class="alternate" type="square">
	<li><a href="http://svn.apache.org/repos/asf/cxf/trunk/core/src/main/java/org/apache/cxf/validation/BeanValidationInInterceptor.java"
class="external-link" rel="nofollow">org.apache.cxf.validation.BeanValidationInInterceptor</a>:
validates resource method parameters against validation constraints, raises javax.validation.ConstraintViolationException
if any violations are encountered</li>
</ul>


<ul class="alternate" type="square">
	<li><a href="http://svn.apache.org/repos/asf/cxf/trunk/core/src/main/java/org/apache/cxf/validation/BeanValidationOutInterceptor.java"
class="external-link" rel="nofollow">org.apache.cxf.validation.BeanValidationOutInterceptor</a>:
validates resource method response values against validation constraints, raises <a href="http://svn.apache.org/repos/asf/cxf/trunk/core/src/main/java/org/apache/cxf/validation/ResponseConstraintViolationException"
class="external-link" rel="nofollow">org.apache.cxf.validation.ResponseConstraintViolationException</a>
if any violations are encountered.</li>
</ul>


<p>Both interceptors depend on <a href="http://svn.apache.org/repos/asf/cxf/trunk/core/src/main/java/org/apache/cxf/validation/BeanValidationProvider.java"
class="external-link" rel="nofollow">org.apache.cxf.validation.BeanValidationProvider</a>
which abstracts away Bean Validation 1.1 API and provides useful utility methods. This provider
can be directly injected into the interceptors as a 'provider' property. Injecting the provider
is optional, the interceptors will create a default provider instance if it has not been injected.
</p>

<p>CXF exception handlers can check if a caught javax.validation.ValidationException
is an instance of CXF-specific ResponseConstraintViolationException in order to find whether
the failure occurred during the return value validation or not.</p>

<p>The provider can be initialized with javax.validation.ParameterNameProvider or <a
href="http://svn.apache.org/repos/asf/cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java"
class="external-link" rel="nofollow">ValidationConfiguration</a> in order to customize
the way Bean Validation 1.1 implementation does its work.</p>

<p>Note that interceptors will only be effective if the current service object is a
singleton. They will make a best effort of getting hold of a reference to the current service
object, which can also be injected directly as a 'serviceObject' property.</p>

<p>Custom interceptors can customize the default processing (for example, see the section
on Bean Validation 1.1 in JAX-RS 2.0). Typical customization is to have one of the input parameters
or the response value unwrapped before it can be validated.</p>

<p><a href="http://svn.apache.org/repos/asf/cxf/trunk/core/src/main/java/org/apache/cxf/validation/BeanValidationFeature.java"
class="external-link" rel="nofollow">org.apache.cxf.validation.BeanValidationFeature</a>
can be used to register both in and out validation interceptors.</p>

<h2><a name="ValidationFeature-Configuration"></a>Configuration</h2>

<p>The following snippets show how to get Bean Validation 1.1 interceptors activated
for both JAX-RS and JAX-WS services using Spring: </p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
// Interface implemented by both JAX-RS and JAX-WS services:
@WebService(targetNamespace = "http://bookworld.com")
@Path("/")
public interface BookWorld {

    @POST
    @Produces("text/xml")
    @Consumes("text/xml")
    @Valid
    BookWithValidation echoBook(@Valid BookWithValidation book);

}

@WebService(endpointInterface = "org.apache.cxf.systest.jaxrs.validation.spring.BookWorld",
            serviceName = "BookWorld")
public class BookWorldImpl implements BookWorld {

    @Override
    public BookWithValidation echoBook(BookWithValidation book) {
        return book;
    }
}

</pre>
</div></div>


<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
&lt;!-- JAX-RS and JAX-WS endpoints --&gt;
&lt;jaxrs:server address="/bwrest"&gt;
        &lt;jaxrs:serviceBeans&gt;
            &lt;ref bean="bookWorldValidation"/&gt;
        &lt;/jaxrs:serviceBeans&gt;
        &lt;jaxrs:providers&gt;
            &lt;ref bean="exceptionMapper"/&gt;
        &lt;/jaxrs:providers&gt;
        &lt;jaxrs:features&gt;
            &lt;ref bean="commonValidationFeature" /&gt;
        &lt;/jaxrs:features&gt;
&lt;/jaxrs:server&gt;
    
&lt;jaxws:endpoint xmlns:s="http://bookworld.com" 
                serviceName="s:BookWorld" 
                endpointName="s:BookWorldPort" 
                implementor="#bookWorldValidation" 
                address="/bwsoap"&gt;
    &lt;jaxws:features&gt;
        &lt;ref bean="commonValidationFeature" /&gt;
     &lt;/jaxws:features&gt;
&lt;/jaxws:endpoint&gt;                
    
&lt;bean id="bookWorldValidation" class="org.apache.cxf.systest.jaxrs.validation.spring.BookWorldImpl"/&gt;
&lt;bean id="commonValidationFeature" class="org.apache.cxf.validation.BeanValidationFeature"/&gt;
</pre>
</div></div>

<p>Check the next section for more examples specific to JAX-RS.</p>

<h1><a name="ValidationFeature-BeanValidation1.1andJAXRS2.0"></a>Bean Validation
1.1 and JAX-RS 2.0</h1>

<p>JAX-RS 2.0 specification (Chapter 7) introduces an optional requirement to get Bean
Validation 1.1 supported.</p>

<p>Using the common interceptors described in the previous section can be sufficient
for JAX-RS 2.0 resource methods having their input parameters and response values validated.
 </p>

<p>However, if you need a response values wrapped in JAX-RS Response validated or make
sure per-request service instances get validated then JAX-RS frontend specific interceptors
and the invoker need to be used:    </p>

<ul class="alternate" type="square">
	<li>org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor: validates JAX-RS
resource method parameters. At the moment it is nearly identical to the common BeanValidationInInterceptor
which it extends. It can also be used as a JAX-RS 2.0 ContainerRequestFilter</li>
</ul>


<ul class="alternate" type="square">
	<li>org.apache.cxf.jaxrs.validation.JAXRSBeanValidationOutInterceptor: validates JAX-RS
resource method return values, unwraps JAX-RS Response. It can also be used as a JAX-RS 2.0
ContainerResponseFilter</li>
</ul>


<ul class="alternate" type="square">
	<li>org.apache.cxf.jaxrs.validation.JAXRSBeanValidationFeature can be used to register
both in and out validation interceptors.</li>
</ul>


<ul class="alternate" type="square">
	<li>org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInvoker: register it as a jaxrs:invoker
if you need non-singleton service objects validated.</li>
</ul>



<p>Note the default JAX-RS ExceptionMapper (org.apache.cxf.jaxrs.validation.ValidationExceptionMapper)
which transforms javax.validation.ValidationException to corresponding HTTP status code has
to be registered. Users can register the custom mappers if preferred.</p>

<p>org.apache.cxf.jaxrs.validation.JAXRSParameterNameProvider can be registered directly
with the common BeanValidationProvider to get the error messages customized.</p>

<p>JAX-RS 2.0 developers should prefer using JAX-RS frontend specific interceptors when
possible to make sure JAX-RS specific fixes are picked up automatically.</p>

<h2><a name="ValidationFeature-ConfiguringBeanValidation1.1usingJAXRSServerFactoryBean"></a>Configuring
Bean Validation 1.1 using JAXRSServerFactoryBean</h2>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses( ... );
sf.setResourceProvider( ... );
sf.setProvider(new ValidationExceptionMapper());
sf.setInInterceptors(Arrays.&lt; Interceptor&lt; ? extends Message &gt; &gt;asList(new
new JAXRSBeanValidationInInterceptor()));
sf.setOutInterceptors(Arrays.&lt; Interceptor&lt; ? extends Message &gt; &gt;asList(new
JAXRSBeanValidationOutInterceptor()));
sf.create();
</pre>
</div></div>

<h2><a name="ValidationFeature-ConfiguringBeanValidation1.1usingSpringbeandefinitionsXML"></a>Configuring
Bean Validation 1.1 using Spring bean definitions XML</h2>

<p>Following the similar approach as for JAXRSServerFactoryBean, in case of Spring respective
bean definitions should be added under &lt;jaxrs:outInterceptors&gt;, &lt;jaxrs:inInterceptors&gt;
and &lt;jaxrs:providers&gt; sections, f.e.:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
&lt;jaxrs:server address="/"&gt;
    &lt;jaxrs:inInterceptors&gt;
        &lt;ref bean="validationInInterceptor" /&gt;
    &lt;/jaxrs:inInterceptors&gt;
        
    &lt;jaxrs:outInterceptors&gt;
        &lt;ref bean="validationOutInterceptor" /&gt;
    &lt;/jaxrs:outInterceptors&gt;
        
    &lt;jaxrs:serviceBeans&gt;
    ...
    &lt;/jaxrs:serviceBeans&gt;
        
    &lt;jaxrs:providers&gt;
        &lt;ref bean="exceptionMapper"/&gt;
    &lt;/jaxrs:providers&gt;
&lt;/jaxrs:server&gt;

&lt;bean id="exceptionMapper" class="org.apache.cxf.jaxrs.validation.ValidationExceptionMapper"/&gt;
&lt;bean id="validationProvider" class="org.apache.cxf.validation.BeanValidationProvider"
/&gt;

&lt;bean id="validationInInterceptor" class="org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor"&gt;
    &lt;property name="provider" ref="validationProvider" /&gt;
&lt;/bean&gt;

&lt;bean id="validationOutInterceptor" class="org.apache.cxf.jaxrs.validation.JAXRSBeanValidationOutInterceptor"&gt;
    &lt;property name="provider" ref="validationProvider" /&gt;
&lt;/bean&gt;   
</pre>
</div></div>

<h2><a name="ValidationFeature-ValidationExceptionsandHTTPstatuscodes"></a>Validation
Exceptions and HTTP status codes</h2>

<p>As per JAX-RS 2.0 specification, any input parameter validation violation is mapped
to HTTP status code 400 Bad Request and any return value validation violation (or internal
validation violation) is mapped to HTTP status code 500 Internal Server Error. This is essentially
what org.apache.cxf.jaxrs.validation.ValidationExceptionMapper does.</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td
valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16"
align="absmiddle" alt="" border="0"></td><td>The details of validation exceptions
are not currently included into the response but only logged. Application developers are encouraged
to register custom exception mappers if reporting the validation error details is required.</td></tr></table></div>

<h1><a name="ValidationFeature-Examples"></a>Examples</h1>

<p>The following examples show JAX-RS resource methods being validated but predefined
or custom Bean Validation 1.1 constraints can be applied to JAX-WS service methods exactly
the same way.</p>

<h2><a name="ValidationFeature-Validatingsimpleinputparameters"></a>Validating
simple input parameters</h2>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
@POST
@Path("/books")
public Response addBook(
        @NotNull @Pattern(regexp = "\\d+") @FormParam("id") String id,
        @NotNull @Size(min = 1, max = 50) @FormParam("name") String name) {
    // do some work
    return Response.created().build();
}
</pre>
</div></div>

<h2><a name="ValidationFeature-Validatingcomplexinputparameters"></a>Validating
complex input parameters</h2>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
@POST
@Path("/books")
public Response addBook( @Valid Book book ) {
    // do some work
    return Response.created().build();
}
</pre>
</div></div>

<p>This example assumes that class Book has validation constraints defined:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
public class Book {
    @NotNull @Pattern(regexp = "\\d+") private String id;
    @NotNull @Size(min = 1, max = 50) private String name;

    // ...
}
</pre>
</div></div>

<h2><a name="ValidationFeature-Validatingreturnvalues%28nonResponse%29"></a>Validating
return values (non-Response)</h2>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
@GET
@Path("/books/{bookId}")
@Override    
@NotNull @Valid
public Book getBook(@PathParam("bookId") String id) {
    return new Book( id );     
}
</pre>
</div></div>

<p>This example assumes that class Book has validation constraints defined (as in example
above).</p>

<h2><a name="ValidationFeature-Validatingreturnvalues%28Response%29"></a>Validating
return values (Response)</h2>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
@GET
@Path("/books/{bookId}")
@Valid @NotNull
public Response getBookResponse(@PathParam("bookId") String id) {
    return Response.ok( new Book( id ) ).build();
}
</pre>
</div></div>

<h1><a name="ValidationFeature-BeanValidationandSchemaValidation"></a>Bean
Validation and Schema Validation</h1>

<p>Web service developers often rely on the schema-based validation. </p>

<p>Bean validation can be used as an alternative form of validation. </p>

<p>However it can also complement the schema-based validation in cases where the current
schema is not very strict.</p>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;" class="grey">
                        <a href="https://cwiki.apache.org/confluence/users/removespacenotification.action?spaceKey=CXF20DOC">Stop
watching space</a>
            <span style="padding: 0px 5px;">|</span>
                <a href="https://cwiki.apache.org/confluence/users/editmyemailsettings.action">Change
email notification preferences</a>
</div>
        <a href="https://cwiki.apache.org/confluence/display/CXF20DOC/ValidationFeature">View
Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=34842111&revisedVersion=17&originalVersion=16">View
Changes</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message