You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Anders Clausen <an...@gmail.com> on 2013/12/11 16:22:45 UTC

JSON, XSD and response validation

Hi

I've only used CXF for a little while and still trying to find my way. I've
got a question that I hope you can help me resolve. For our current project
we expose a service both as REST and as SOAP. We have defined our
interfaces through XSDs and use JAXB2. We want to turn on response
validation during development time and have successfully done that for our
SOAP service, however, when it comes to our REST service I am not sure if
this can be done. How does JSON work with XSDs? I've been trying to follow
the guidelines from this page
CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
but
without any luck.

This is the code I've used:

    <bean id="exRSJsonProvider"
class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
        <property name="dropRootElement" value="false" />
        <property name="supportUnwrapped" value="true" />
        <property name="ignoreNamespaces" value="true" />
        <property name="schemaHandler" ref="schemaHolder"/>
    </bean>

    <bean id="jaxbProvider"
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
        <property name="schemaHandler" ref="schemaHolder"/>
    </bean>

    <bean id="schemaHolder"
class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
        <property name="schemas" ref="theSchemas"/>
    </bean>

    <util:list id="theSchemas">
        <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
    </util:list>

    <jaxrs:server name="exRSScheduleResource"
address="${ex.rs.endpoint.address}">
        <jaxrs:serviceBeans>
            <bean
                    class="com.ex.rs.ScheduleResource" />
            <bean class="com.ex.rs.LocationResource" />
        </jaxrs:serviceBeans>
        <jaxrs:properties>
            <entry key="schema-validation-enabled" value="true" />
        </jaxrs:properties>
        <jaxrs:schemaLocations>

<jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:schemaLocation>
        </jaxrs:schemaLocations>
        <jaxrs:providers>
            <ref bean="exRSJsonProvider" />
            <ref bean="jaxbProvider" />"
            <ref bean="dateParamHandler" />
            <ref bean="timeParamHandler" />
        </jaxrs:providers>

        ....................
        ....................
</jaxrs:server>

Is this even possible to be done or should I just drop the idea?

Cheers
Anders

Re: JSON, XSD and response validation

Posted by Sergey Beryozkin <sb...@gmail.com>.
On 12/12/13 08:07, Anders Clausen wrote:
> Jose,
>
> I had the following header value 'accept=application/xml' set, so I was
> getting XML returned rather than JSON, hence why I showed the definition
> for the JAXB provider. I also set the 'validateOutput=true' on the JSON
> provider and that also triggered an error (I removed the
> 'accept=application/xml' header value for that test). The only difference I
> see in the way that error handling is done, is that the JSON provider
> throws a javax.ws.rs.InternalServerErrorException and the JAXB provider
> throws a javax.ws.rs.BadRequestException.
I've fixed the typo in JAXB provider,
thanks, Sergey

>
> I hope that answers your question but let me know if you need more info.
>
>
> On 11 December 2013 19:55, Jose María Zaragoza <de...@gmail.com> wrote:
>
>> Thanks, but I don't understand one thing
>> You are enabled it for JAXB provider, but not for JSON provider . And
>> your question were about output validation schema for JSON messages,
>> right ?
>>
>>
>>
>> 2013/12/11 Anders Clausen <an...@gmail.com>:
>>> I did the following:
>>>
>>> <bean id="jaxbProvider"
>>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>>>          <property name="schemaHandler" ref="schemaHolder"/>
>>>          <property name="validateOutput" value="true"/>
>>>   </bean>
>>>
>>> I haven't tested 'validateBeforeWrite' but will do that tomorrow.
>>>
>>>
>>> On 11 December 2013 17:07, Jose María Zaragoza <de...@gmail.com>
>> wrote:
>>>
>>>> Can you paste your code  ?
>>>> So I can see the final solution
>>>>
>>>> Regards
>>>>
>>>> 2013/12/11 Anders Clausen <an...@gmail.com>:
>>>>> Jose,
>>>>>
>>>>> that did the trick! I tried out the 'validateOutput' property on the
>> JAXB
>>>>> provider and it works. I have to be honest and say that I didn't see
>> that
>>>>> section on the page - thought it would have been before the stuff
>> about
>>>>> 'catalogs' but that's just me;-)
>>>>>
>>>>> Thank you all for your quick replies - the solution has made my day!
>>>>>
>>>>> Cheers!
>>>>>
>>>>>
>>>>> On 11 December 2013 16:15, Jose María Zaragoza <de...@gmail.com>
>>>> wrote:
>>>>>
>>>>>> Hi:
>>>>>>
>>>>>> I've never tried to enable schema validation to data output ( it
>>>>>> doesn't make sense *for me* )
>>>>>> Reading that webpage:
>>>>>>
>>>>>> - I think that
>>>>>>
>>>>>> <jaxrs:properties>
>>>>>>              <entry key="schema-validation-enabled" value="true" />
>>>>>> </jaxrs:properties>
>>>>>>
>>>>>> doesn't enable JAX-RS schema validation
>>>>>>
>>>>>>
>>>>>> - About that webpage
>>>>>>
>>>>>> "By default, after a valid schema has been located, only JAXB
>>>>>> Unmarshaller will use it to validate the input.
>>>>>> Starting from CXF 2.3.4 and 2.4, the following properties can be used
>>>>>> to enable the output validation:
>>>>>>
>>>>>> validateOutput
>>>>>> validateBeforeWrite
>>>>>>
>>>>>> Setting the 'validateOutput' property will ensure that JAXBMarshaller
>>>>>> will validate the output while writing the data. The
>>>>>> 'validateBeforeWrite' property can be set to ensure the validation is
>>>>>> done before data are written to the output stream."
>>>>>>
>>>>>> Did you test these properties ?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> 2013/12/11 Anders Clausen <an...@gmail.com>:
>>>>>>> Hi Sergey
>>>>>>>
>>>>>>> Thanks for replying so quickly. Yes, it is the output data (the
>>>> response
>>>>>>> sent back to the calling client) that we're trying to validate.
>>>>>>>
>>>>>>> Cheers
>>>>>>> Anders
>>>>>>>
>>>>>>>
>>>>>>> On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com>
>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi
>>>>>>>>
>>>>>>>>
>>>>>>>> On 11/12/13 15:22, Anders Clausen wrote:
>>>>>>>>
>>>>>>>>> Hi
>>>>>>>>>
>>>>>>>>> I've only used CXF for a little while and still trying to find my
>>>> way.
>>>>>>>>> I've
>>>>>>>>> got a question that I hope you can help me resolve. For our
>> current
>>>>>>>>> project
>>>>>>>>> we expose a service both as REST and as SOAP. We have defined our
>>>>>>>>> interfaces through XSDs and use JAXB2. We want to turn on
>> response
>>>>>>>>> validation during development time and have successfully done
>> that
>>>> for
>>>>>> our
>>>>>>>>> SOAP service, however, when it comes to our REST service I am not
>>>> sure
>>>>>> if
>>>>>>>>> this can be done. How does JSON work with XSDs? I've been trying
>> to
>>>>>> follow
>>>>>>>>> the guidelines from this page
>>>>>>>>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
>>>>>>>>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
>>>>>>>>>
>>>>>>>>> but
>>>>>>>>> without any luck.
>>>>>>>>>
>>>>>>>>> This is the code I've used:
>>>>>>>>>
>>>>>>>>>       <bean id="exRSJsonProvider"
>>>>>>>>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>>>>>>>>>           <property name="dropRootElement" value="false" />
>>>>>>>>>           <property name="supportUnwrapped" value="true" />
>>>>>>>>>           <property name="ignoreNamespaces" value="true" />
>>>>>>>>>           <property name="schemaHandler" ref="schemaHolder"/>
>>>>>>>>>       </bean>
>>>>>>>>>
>>>>>>>>>       <bean id="jaxbProvider"
>>>>>>>>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>>>>>>>>>           <property name="schemaHandler" ref="schemaHolder"/>
>>>>>>>>>       </bean>
>>>>>>>>>
>>>>>>>>>       <bean id="schemaHolder"
>>>>>>>>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
>>>>>>>>>           <property name="schemas" ref="theSchemas"/>
>>>>>>>>>       </bean>
>>>>>>>>>
>>>>>>>>>       <util:list id="theSchemas">
>>>>>>>>>
>>   <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
>>>>>>>>>       </util:list>
>>>>>>>>>
>>>>>>>>>       <jaxrs:server name="exRSScheduleResource"
>>>>>>>>> address="${ex.rs.endpoint.address}">
>>>>>>>>>           <jaxrs:serviceBeans>
>>>>>>>>>               <bean
>>>>>>>>>                       class="com.ex.rs.ScheduleResource" />
>>>>>>>>>               <bean class="com.ex.rs.LocationResource" />
>>>>>>>>>           </jaxrs:serviceBeans>
>>>>>>>>>           <jaxrs:properties>
>>>>>>>>>               <entry key="schema-validation-enabled" value="true"
>> />
>>>>>>>>>           </jaxrs:properties>
>>>>>>>>>           <jaxrs:schemaLocations>
>>>>>>>>>
>>>>>>>>>
>>>>>>
>>>>
>> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
>>>>>>>>> schemaLocation>
>>>>>>>>>           </jaxrs:schemaLocations>
>>>>>>>>>           <jaxrs:providers>
>>>>>>>>>               <ref bean="exRSJsonProvider" />
>>>>>>>>>               <ref bean="jaxbProvider" />"
>>>>>>>>>               <ref bean="dateParamHandler" />
>>>>>>>>>               <ref bean="timeParamHandler" />
>>>>>>>>>           </jaxrs:providers>
>>>>>>>>>
>>>>>>>>>           ....................
>>>>>>>>>           ....................
>>>>>>>>> </jaxrs:server>
>>>>>>>>>
>>>>>>>>> Is this even possible to be done or should I just drop the idea?
>>>>>>>>>
>>>>>>>> Technically it is possible, we have tests where input JSON
>> sequences
>>>> are
>>>>>>>> validated, it works with Jettison because they are eventually
>>>> handled by
>>>>>>>> JAXB.
>>>>>>>>
>>>>>>>> I'm presuming that the input JSON sequence has no namespace
>> prefixes,
>>>>>>>> right ? Does the JAX-RS resource method accepting a JAXB bean
>>>> populated
>>>>>>>> from such a sequence has a namespace property at all ?
>>>>>>>>
>>>>>>>> Or are you trying to validate output data by any chance ?
>>>>>>>>
>>>>>>>> Cheers, Sergey
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Cheers
>>>>>>>>> Anders
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Re: JSON, XSD and response validation

Posted by Jose María Zaragoza <de...@gmail.com>.
All clear :-)

Thanks and regards !!!

2013/12/12 Anders Clausen <an...@gmail.com>:
> Jose,
>
> I had the following header value 'accept=application/xml' set, so I was
> getting XML returned rather than JSON, hence why I showed the definition
> for the JAXB provider. I also set the 'validateOutput=true' on the JSON
> provider and that also triggered an error (I removed the
> 'accept=application/xml' header value for that test). The only difference I
> see in the way that error handling is done, is that the JSON provider
> throws a javax.ws.rs.InternalServerErrorException and the JAXB provider
> throws a javax.ws.rs.BadRequestException.
>
> I hope that answers your question but let me know if you need more info.
>
>
> On 11 December 2013 19:55, Jose María Zaragoza <de...@gmail.com> wrote:
>
>> Thanks, but I don't understand one thing
>> You are enabled it for JAXB provider, but not for JSON provider . And
>> your question were about output validation schema for JSON messages,
>> right ?
>>
>>
>>
>> 2013/12/11 Anders Clausen <an...@gmail.com>:
>> > I did the following:
>> >
>> > <bean id="jaxbProvider"
>> > class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>> >         <property name="schemaHandler" ref="schemaHolder"/>
>> >         <property name="validateOutput" value="true"/>
>> >  </bean>
>> >
>> > I haven't tested 'validateBeforeWrite' but will do that tomorrow.
>> >
>> >
>> > On 11 December 2013 17:07, Jose María Zaragoza <de...@gmail.com>
>> wrote:
>> >
>> >> Can you paste your code  ?
>> >> So I can see the final solution
>> >>
>> >> Regards
>> >>
>> >> 2013/12/11 Anders Clausen <an...@gmail.com>:
>> >> > Jose,
>> >> >
>> >> > that did the trick! I tried out the 'validateOutput' property on the
>> JAXB
>> >> > provider and it works. I have to be honest and say that I didn't see
>> that
>> >> > section on the page - thought it would have been before the stuff
>> about
>> >> > 'catalogs' but that's just me;-)
>> >> >
>> >> > Thank you all for your quick replies - the solution has made my day!
>> >> >
>> >> > Cheers!
>> >> >
>> >> >
>> >> > On 11 December 2013 16:15, Jose María Zaragoza <de...@gmail.com>
>> >> wrote:
>> >> >
>> >> >> Hi:
>> >> >>
>> >> >> I've never tried to enable schema validation to data output ( it
>> >> >> doesn't make sense *for me* )
>> >> >> Reading that webpage:
>> >> >>
>> >> >> - I think that
>> >> >>
>> >> >> <jaxrs:properties>
>> >> >>             <entry key="schema-validation-enabled" value="true" />
>> >> >> </jaxrs:properties>
>> >> >>
>> >> >> doesn't enable JAX-RS schema validation
>> >> >>
>> >> >>
>> >> >> - About that webpage
>> >> >>
>> >> >> "By default, after a valid schema has been located, only JAXB
>> >> >> Unmarshaller will use it to validate the input.
>> >> >> Starting from CXF 2.3.4 and 2.4, the following properties can be used
>> >> >> to enable the output validation:
>> >> >>
>> >> >> validateOutput
>> >> >> validateBeforeWrite
>> >> >>
>> >> >> Setting the 'validateOutput' property will ensure that JAXBMarshaller
>> >> >> will validate the output while writing the data. The
>> >> >> 'validateBeforeWrite' property can be set to ensure the validation is
>> >> >> done before data are written to the output stream."
>> >> >>
>> >> >> Did you test these properties ?
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >> 2013/12/11 Anders Clausen <an...@gmail.com>:
>> >> >> > Hi Sergey
>> >> >> >
>> >> >> > Thanks for replying so quickly. Yes, it is the output data (the
>> >> response
>> >> >> > sent back to the calling client) that we're trying to validate.
>> >> >> >
>> >> >> > Cheers
>> >> >> > Anders
>> >> >> >
>> >> >> >
>> >> >> > On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com>
>> >> >> wrote:
>> >> >> >
>> >> >> >> Hi
>> >> >> >>
>> >> >> >>
>> >> >> >> On 11/12/13 15:22, Anders Clausen wrote:
>> >> >> >>
>> >> >> >>> Hi
>> >> >> >>>
>> >> >> >>> I've only used CXF for a little while and still trying to find my
>> >> way.
>> >> >> >>> I've
>> >> >> >>> got a question that I hope you can help me resolve. For our
>> current
>> >> >> >>> project
>> >> >> >>> we expose a service both as REST and as SOAP. We have defined our
>> >> >> >>> interfaces through XSDs and use JAXB2. We want to turn on
>> response
>> >> >> >>> validation during development time and have successfully done
>> that
>> >> for
>> >> >> our
>> >> >> >>> SOAP service, however, when it comes to our REST service I am not
>> >> sure
>> >> >> if
>> >> >> >>> this can be done. How does JSON work with XSDs? I've been trying
>> to
>> >> >> follow
>> >> >> >>> the guidelines from this page
>> >> >> >>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
>> >> >> >>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
>> >> >> >>>
>> >> >> >>> but
>> >> >> >>> without any luck.
>> >> >> >>>
>> >> >> >>> This is the code I've used:
>> >> >> >>>
>> >> >> >>>      <bean id="exRSJsonProvider"
>> >> >> >>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>> >> >> >>>          <property name="dropRootElement" value="false" />
>> >> >> >>>          <property name="supportUnwrapped" value="true" />
>> >> >> >>>          <property name="ignoreNamespaces" value="true" />
>> >> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
>> >> >> >>>      </bean>
>> >> >> >>>
>> >> >> >>>      <bean id="jaxbProvider"
>> >> >> >>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>> >> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
>> >> >> >>>      </bean>
>> >> >> >>>
>> >> >> >>>      <bean id="schemaHolder"
>> >> >> >>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
>> >> >> >>>          <property name="schemas" ref="theSchemas"/>
>> >> >> >>>      </bean>
>> >> >> >>>
>> >> >> >>>      <util:list id="theSchemas">
>> >> >> >>>
>>  <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
>> >> >> >>>      </util:list>
>> >> >> >>>
>> >> >> >>>      <jaxrs:server name="exRSScheduleResource"
>> >> >> >>> address="${ex.rs.endpoint.address}">
>> >> >> >>>          <jaxrs:serviceBeans>
>> >> >> >>>              <bean
>> >> >> >>>                      class="com.ex.rs.ScheduleResource" />
>> >> >> >>>              <bean class="com.ex.rs.LocationResource" />
>> >> >> >>>          </jaxrs:serviceBeans>
>> >> >> >>>          <jaxrs:properties>
>> >> >> >>>              <entry key="schema-validation-enabled" value="true"
>> />
>> >> >> >>>          </jaxrs:properties>
>> >> >> >>>          <jaxrs:schemaLocations>
>> >> >> >>>
>> >> >> >>>
>> >> >>
>> >>
>> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
>> >> >> >>> schemaLocation>
>> >> >> >>>          </jaxrs:schemaLocations>
>> >> >> >>>          <jaxrs:providers>
>> >> >> >>>              <ref bean="exRSJsonProvider" />
>> >> >> >>>              <ref bean="jaxbProvider" />"
>> >> >> >>>              <ref bean="dateParamHandler" />
>> >> >> >>>              <ref bean="timeParamHandler" />
>> >> >> >>>          </jaxrs:providers>
>> >> >> >>>
>> >> >> >>>          ....................
>> >> >> >>>          ....................
>> >> >> >>> </jaxrs:server>
>> >> >> >>>
>> >> >> >>> Is this even possible to be done or should I just drop the idea?
>> >> >> >>>
>> >> >> >> Technically it is possible, we have tests where input JSON
>> sequences
>> >> are
>> >> >> >> validated, it works with Jettison because they are eventually
>> >> handled by
>> >> >> >> JAXB.
>> >> >> >>
>> >> >> >> I'm presuming that the input JSON sequence has no namespace
>> prefixes,
>> >> >> >> right ? Does the JAX-RS resource method accepting a JAXB bean
>> >> populated
>> >> >> >> from such a sequence has a namespace property at all ?
>> >> >> >>
>> >> >> >> Or are you trying to validate output data by any chance ?
>> >> >> >>
>> >> >> >> Cheers, Sergey
>> >> >> >>
>> >> >> >>>
>> >> >> >>> Cheers
>> >> >> >>> Anders
>> >> >> >>>
>> >> >> >>>
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >>
>> >>
>>

Re: JSON, XSD and response validation

Posted by Anders Clausen <an...@gmail.com>.
Jose,

I had the following header value 'accept=application/xml' set, so I was
getting XML returned rather than JSON, hence why I showed the definition
for the JAXB provider. I also set the 'validateOutput=true' on the JSON
provider and that also triggered an error (I removed the
'accept=application/xml' header value for that test). The only difference I
see in the way that error handling is done, is that the JSON provider
throws a javax.ws.rs.InternalServerErrorException and the JAXB provider
throws a javax.ws.rs.BadRequestException.

I hope that answers your question but let me know if you need more info.


On 11 December 2013 19:55, Jose María Zaragoza <de...@gmail.com> wrote:

> Thanks, but I don't understand one thing
> You are enabled it for JAXB provider, but not for JSON provider . And
> your question were about output validation schema for JSON messages,
> right ?
>
>
>
> 2013/12/11 Anders Clausen <an...@gmail.com>:
> > I did the following:
> >
> > <bean id="jaxbProvider"
> > class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
> >         <property name="schemaHandler" ref="schemaHolder"/>
> >         <property name="validateOutput" value="true"/>
> >  </bean>
> >
> > I haven't tested 'validateBeforeWrite' but will do that tomorrow.
> >
> >
> > On 11 December 2013 17:07, Jose María Zaragoza <de...@gmail.com>
> wrote:
> >
> >> Can you paste your code  ?
> >> So I can see the final solution
> >>
> >> Regards
> >>
> >> 2013/12/11 Anders Clausen <an...@gmail.com>:
> >> > Jose,
> >> >
> >> > that did the trick! I tried out the 'validateOutput' property on the
> JAXB
> >> > provider and it works. I have to be honest and say that I didn't see
> that
> >> > section on the page - thought it would have been before the stuff
> about
> >> > 'catalogs' but that's just me;-)
> >> >
> >> > Thank you all for your quick replies - the solution has made my day!
> >> >
> >> > Cheers!
> >> >
> >> >
> >> > On 11 December 2013 16:15, Jose María Zaragoza <de...@gmail.com>
> >> wrote:
> >> >
> >> >> Hi:
> >> >>
> >> >> I've never tried to enable schema validation to data output ( it
> >> >> doesn't make sense *for me* )
> >> >> Reading that webpage:
> >> >>
> >> >> - I think that
> >> >>
> >> >> <jaxrs:properties>
> >> >>             <entry key="schema-validation-enabled" value="true" />
> >> >> </jaxrs:properties>
> >> >>
> >> >> doesn't enable JAX-RS schema validation
> >> >>
> >> >>
> >> >> - About that webpage
> >> >>
> >> >> "By default, after a valid schema has been located, only JAXB
> >> >> Unmarshaller will use it to validate the input.
> >> >> Starting from CXF 2.3.4 and 2.4, the following properties can be used
> >> >> to enable the output validation:
> >> >>
> >> >> validateOutput
> >> >> validateBeforeWrite
> >> >>
> >> >> Setting the 'validateOutput' property will ensure that JAXBMarshaller
> >> >> will validate the output while writing the data. The
> >> >> 'validateBeforeWrite' property can be set to ensure the validation is
> >> >> done before data are written to the output stream."
> >> >>
> >> >> Did you test these properties ?
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> 2013/12/11 Anders Clausen <an...@gmail.com>:
> >> >> > Hi Sergey
> >> >> >
> >> >> > Thanks for replying so quickly. Yes, it is the output data (the
> >> response
> >> >> > sent back to the calling client) that we're trying to validate.
> >> >> >
> >> >> > Cheers
> >> >> > Anders
> >> >> >
> >> >> >
> >> >> > On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com>
> >> >> wrote:
> >> >> >
> >> >> >> Hi
> >> >> >>
> >> >> >>
> >> >> >> On 11/12/13 15:22, Anders Clausen wrote:
> >> >> >>
> >> >> >>> Hi
> >> >> >>>
> >> >> >>> I've only used CXF for a little while and still trying to find my
> >> way.
> >> >> >>> I've
> >> >> >>> got a question that I hope you can help me resolve. For our
> current
> >> >> >>> project
> >> >> >>> we expose a service both as REST and as SOAP. We have defined our
> >> >> >>> interfaces through XSDs and use JAXB2. We want to turn on
> response
> >> >> >>> validation during development time and have successfully done
> that
> >> for
> >> >> our
> >> >> >>> SOAP service, however, when it comes to our REST service I am not
> >> sure
> >> >> if
> >> >> >>> this can be done. How does JSON work with XSDs? I've been trying
> to
> >> >> follow
> >> >> >>> the guidelines from this page
> >> >> >>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
> >> >> >>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
> >> >> >>>
> >> >> >>> but
> >> >> >>> without any luck.
> >> >> >>>
> >> >> >>> This is the code I've used:
> >> >> >>>
> >> >> >>>      <bean id="exRSJsonProvider"
> >> >> >>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
> >> >> >>>          <property name="dropRootElement" value="false" />
> >> >> >>>          <property name="supportUnwrapped" value="true" />
> >> >> >>>          <property name="ignoreNamespaces" value="true" />
> >> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
> >> >> >>>      </bean>
> >> >> >>>
> >> >> >>>      <bean id="jaxbProvider"
> >> >> >>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
> >> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
> >> >> >>>      </bean>
> >> >> >>>
> >> >> >>>      <bean id="schemaHolder"
> >> >> >>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
> >> >> >>>          <property name="schemas" ref="theSchemas"/>
> >> >> >>>      </bean>
> >> >> >>>
> >> >> >>>      <util:list id="theSchemas">
> >> >> >>>
>  <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
> >> >> >>>      </util:list>
> >> >> >>>
> >> >> >>>      <jaxrs:server name="exRSScheduleResource"
> >> >> >>> address="${ex.rs.endpoint.address}">
> >> >> >>>          <jaxrs:serviceBeans>
> >> >> >>>              <bean
> >> >> >>>                      class="com.ex.rs.ScheduleResource" />
> >> >> >>>              <bean class="com.ex.rs.LocationResource" />
> >> >> >>>          </jaxrs:serviceBeans>
> >> >> >>>          <jaxrs:properties>
> >> >> >>>              <entry key="schema-validation-enabled" value="true"
> />
> >> >> >>>          </jaxrs:properties>
> >> >> >>>          <jaxrs:schemaLocations>
> >> >> >>>
> >> >> >>>
> >> >>
> >>
> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
> >> >> >>> schemaLocation>
> >> >> >>>          </jaxrs:schemaLocations>
> >> >> >>>          <jaxrs:providers>
> >> >> >>>              <ref bean="exRSJsonProvider" />
> >> >> >>>              <ref bean="jaxbProvider" />"
> >> >> >>>              <ref bean="dateParamHandler" />
> >> >> >>>              <ref bean="timeParamHandler" />
> >> >> >>>          </jaxrs:providers>
> >> >> >>>
> >> >> >>>          ....................
> >> >> >>>          ....................
> >> >> >>> </jaxrs:server>
> >> >> >>>
> >> >> >>> Is this even possible to be done or should I just drop the idea?
> >> >> >>>
> >> >> >> Technically it is possible, we have tests where input JSON
> sequences
> >> are
> >> >> >> validated, it works with Jettison because they are eventually
> >> handled by
> >> >> >> JAXB.
> >> >> >>
> >> >> >> I'm presuming that the input JSON sequence has no namespace
> prefixes,
> >> >> >> right ? Does the JAX-RS resource method accepting a JAXB bean
> >> populated
> >> >> >> from such a sequence has a namespace property at all ?
> >> >> >>
> >> >> >> Or are you trying to validate output data by any chance ?
> >> >> >>
> >> >> >> Cheers, Sergey
> >> >> >>
> >> >> >>>
> >> >> >>> Cheers
> >> >> >>> Anders
> >> >> >>>
> >> >> >>>
> >> >> >>
> >> >> >>
> >> >> >>
> >> >>
> >>
>

Re: JSON, XSD and response validation

Posted by Jose María Zaragoza <de...@gmail.com>.
Thanks, but I don't understand one thing
You are enabled it for JAXB provider, but not for JSON provider . And
your question were about output validation schema for JSON messages,
right ?



2013/12/11 Anders Clausen <an...@gmail.com>:
> I did the following:
>
> <bean id="jaxbProvider"
> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>         <property name="schemaHandler" ref="schemaHolder"/>
>         <property name="validateOutput" value="true"/>
>  </bean>
>
> I haven't tested 'validateBeforeWrite' but will do that tomorrow.
>
>
> On 11 December 2013 17:07, Jose María Zaragoza <de...@gmail.com> wrote:
>
>> Can you paste your code  ?
>> So I can see the final solution
>>
>> Regards
>>
>> 2013/12/11 Anders Clausen <an...@gmail.com>:
>> > Jose,
>> >
>> > that did the trick! I tried out the 'validateOutput' property on the JAXB
>> > provider and it works. I have to be honest and say that I didn't see that
>> > section on the page - thought it would have been before the stuff about
>> > 'catalogs' but that's just me;-)
>> >
>> > Thank you all for your quick replies - the solution has made my day!
>> >
>> > Cheers!
>> >
>> >
>> > On 11 December 2013 16:15, Jose María Zaragoza <de...@gmail.com>
>> wrote:
>> >
>> >> Hi:
>> >>
>> >> I've never tried to enable schema validation to data output ( it
>> >> doesn't make sense *for me* )
>> >> Reading that webpage:
>> >>
>> >> - I think that
>> >>
>> >> <jaxrs:properties>
>> >>             <entry key="schema-validation-enabled" value="true" />
>> >> </jaxrs:properties>
>> >>
>> >> doesn't enable JAX-RS schema validation
>> >>
>> >>
>> >> - About that webpage
>> >>
>> >> "By default, after a valid schema has been located, only JAXB
>> >> Unmarshaller will use it to validate the input.
>> >> Starting from CXF 2.3.4 and 2.4, the following properties can be used
>> >> to enable the output validation:
>> >>
>> >> validateOutput
>> >> validateBeforeWrite
>> >>
>> >> Setting the 'validateOutput' property will ensure that JAXBMarshaller
>> >> will validate the output while writing the data. The
>> >> 'validateBeforeWrite' property can be set to ensure the validation is
>> >> done before data are written to the output stream."
>> >>
>> >> Did you test these properties ?
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> 2013/12/11 Anders Clausen <an...@gmail.com>:
>> >> > Hi Sergey
>> >> >
>> >> > Thanks for replying so quickly. Yes, it is the output data (the
>> response
>> >> > sent back to the calling client) that we're trying to validate.
>> >> >
>> >> > Cheers
>> >> > Anders
>> >> >
>> >> >
>> >> > On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com>
>> >> wrote:
>> >> >
>> >> >> Hi
>> >> >>
>> >> >>
>> >> >> On 11/12/13 15:22, Anders Clausen wrote:
>> >> >>
>> >> >>> Hi
>> >> >>>
>> >> >>> I've only used CXF for a little while and still trying to find my
>> way.
>> >> >>> I've
>> >> >>> got a question that I hope you can help me resolve. For our current
>> >> >>> project
>> >> >>> we expose a service both as REST and as SOAP. We have defined our
>> >> >>> interfaces through XSDs and use JAXB2. We want to turn on response
>> >> >>> validation during development time and have successfully done that
>> for
>> >> our
>> >> >>> SOAP service, however, when it comes to our REST service I am not
>> sure
>> >> if
>> >> >>> this can be done. How does JSON work with XSDs? I've been trying to
>> >> follow
>> >> >>> the guidelines from this page
>> >> >>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
>> >> >>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
>> >> >>>
>> >> >>> but
>> >> >>> without any luck.
>> >> >>>
>> >> >>> This is the code I've used:
>> >> >>>
>> >> >>>      <bean id="exRSJsonProvider"
>> >> >>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>> >> >>>          <property name="dropRootElement" value="false" />
>> >> >>>          <property name="supportUnwrapped" value="true" />
>> >> >>>          <property name="ignoreNamespaces" value="true" />
>> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
>> >> >>>      </bean>
>> >> >>>
>> >> >>>      <bean id="jaxbProvider"
>> >> >>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
>> >> >>>      </bean>
>> >> >>>
>> >> >>>      <bean id="schemaHolder"
>> >> >>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
>> >> >>>          <property name="schemas" ref="theSchemas"/>
>> >> >>>      </bean>
>> >> >>>
>> >> >>>      <util:list id="theSchemas">
>> >> >>>          <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
>> >> >>>      </util:list>
>> >> >>>
>> >> >>>      <jaxrs:server name="exRSScheduleResource"
>> >> >>> address="${ex.rs.endpoint.address}">
>> >> >>>          <jaxrs:serviceBeans>
>> >> >>>              <bean
>> >> >>>                      class="com.ex.rs.ScheduleResource" />
>> >> >>>              <bean class="com.ex.rs.LocationResource" />
>> >> >>>          </jaxrs:serviceBeans>
>> >> >>>          <jaxrs:properties>
>> >> >>>              <entry key="schema-validation-enabled" value="true" />
>> >> >>>          </jaxrs:properties>
>> >> >>>          <jaxrs:schemaLocations>
>> >> >>>
>> >> >>>
>> >>
>> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
>> >> >>> schemaLocation>
>> >> >>>          </jaxrs:schemaLocations>
>> >> >>>          <jaxrs:providers>
>> >> >>>              <ref bean="exRSJsonProvider" />
>> >> >>>              <ref bean="jaxbProvider" />"
>> >> >>>              <ref bean="dateParamHandler" />
>> >> >>>              <ref bean="timeParamHandler" />
>> >> >>>          </jaxrs:providers>
>> >> >>>
>> >> >>>          ....................
>> >> >>>          ....................
>> >> >>> </jaxrs:server>
>> >> >>>
>> >> >>> Is this even possible to be done or should I just drop the idea?
>> >> >>>
>> >> >> Technically it is possible, we have tests where input JSON sequences
>> are
>> >> >> validated, it works with Jettison because they are eventually
>> handled by
>> >> >> JAXB.
>> >> >>
>> >> >> I'm presuming that the input JSON sequence has no namespace prefixes,
>> >> >> right ? Does the JAX-RS resource method accepting a JAXB bean
>> populated
>> >> >> from such a sequence has a namespace property at all ?
>> >> >>
>> >> >> Or are you trying to validate output data by any chance ?
>> >> >>
>> >> >> Cheers, Sergey
>> >> >>
>> >> >>>
>> >> >>> Cheers
>> >> >>> Anders
>> >> >>>
>> >> >>>
>> >> >>
>> >> >>
>> >> >>
>> >>
>>

Re: JSON, XSD and response validation

Posted by Anders Clausen <an...@gmail.com>.
I did the following:

<bean id="jaxbProvider"
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
        <property name="schemaHandler" ref="schemaHolder"/>
        <property name="validateOutput" value="true"/>
 </bean>

I haven't tested 'validateBeforeWrite' but will do that tomorrow.


On 11 December 2013 17:07, Jose María Zaragoza <de...@gmail.com> wrote:

> Can you paste your code  ?
> So I can see the final solution
>
> Regards
>
> 2013/12/11 Anders Clausen <an...@gmail.com>:
> > Jose,
> >
> > that did the trick! I tried out the 'validateOutput' property on the JAXB
> > provider and it works. I have to be honest and say that I didn't see that
> > section on the page - thought it would have been before the stuff about
> > 'catalogs' but that's just me;-)
> >
> > Thank you all for your quick replies - the solution has made my day!
> >
> > Cheers!
> >
> >
> > On 11 December 2013 16:15, Jose María Zaragoza <de...@gmail.com>
> wrote:
> >
> >> Hi:
> >>
> >> I've never tried to enable schema validation to data output ( it
> >> doesn't make sense *for me* )
> >> Reading that webpage:
> >>
> >> - I think that
> >>
> >> <jaxrs:properties>
> >>             <entry key="schema-validation-enabled" value="true" />
> >> </jaxrs:properties>
> >>
> >> doesn't enable JAX-RS schema validation
> >>
> >>
> >> - About that webpage
> >>
> >> "By default, after a valid schema has been located, only JAXB
> >> Unmarshaller will use it to validate the input.
> >> Starting from CXF 2.3.4 and 2.4, the following properties can be used
> >> to enable the output validation:
> >>
> >> validateOutput
> >> validateBeforeWrite
> >>
> >> Setting the 'validateOutput' property will ensure that JAXBMarshaller
> >> will validate the output while writing the data. The
> >> 'validateBeforeWrite' property can be set to ensure the validation is
> >> done before data are written to the output stream."
> >>
> >> Did you test these properties ?
> >>
> >>
> >>
> >>
> >>
> >>
> >> 2013/12/11 Anders Clausen <an...@gmail.com>:
> >> > Hi Sergey
> >> >
> >> > Thanks for replying so quickly. Yes, it is the output data (the
> response
> >> > sent back to the calling client) that we're trying to validate.
> >> >
> >> > Cheers
> >> > Anders
> >> >
> >> >
> >> > On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com>
> >> wrote:
> >> >
> >> >> Hi
> >> >>
> >> >>
> >> >> On 11/12/13 15:22, Anders Clausen wrote:
> >> >>
> >> >>> Hi
> >> >>>
> >> >>> I've only used CXF for a little while and still trying to find my
> way.
> >> >>> I've
> >> >>> got a question that I hope you can help me resolve. For our current
> >> >>> project
> >> >>> we expose a service both as REST and as SOAP. We have defined our
> >> >>> interfaces through XSDs and use JAXB2. We want to turn on response
> >> >>> validation during development time and have successfully done that
> for
> >> our
> >> >>> SOAP service, however, when it comes to our REST service I am not
> sure
> >> if
> >> >>> this can be done. How does JSON work with XSDs? I've been trying to
> >> follow
> >> >>> the guidelines from this page
> >> >>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
> >> >>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
> >> >>>
> >> >>> but
> >> >>> without any luck.
> >> >>>
> >> >>> This is the code I've used:
> >> >>>
> >> >>>      <bean id="exRSJsonProvider"
> >> >>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
> >> >>>          <property name="dropRootElement" value="false" />
> >> >>>          <property name="supportUnwrapped" value="true" />
> >> >>>          <property name="ignoreNamespaces" value="true" />
> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
> >> >>>      </bean>
> >> >>>
> >> >>>      <bean id="jaxbProvider"
> >> >>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
> >> >>>          <property name="schemaHandler" ref="schemaHolder"/>
> >> >>>      </bean>
> >> >>>
> >> >>>      <bean id="schemaHolder"
> >> >>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
> >> >>>          <property name="schemas" ref="theSchemas"/>
> >> >>>      </bean>
> >> >>>
> >> >>>      <util:list id="theSchemas">
> >> >>>          <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
> >> >>>      </util:list>
> >> >>>
> >> >>>      <jaxrs:server name="exRSScheduleResource"
> >> >>> address="${ex.rs.endpoint.address}">
> >> >>>          <jaxrs:serviceBeans>
> >> >>>              <bean
> >> >>>                      class="com.ex.rs.ScheduleResource" />
> >> >>>              <bean class="com.ex.rs.LocationResource" />
> >> >>>          </jaxrs:serviceBeans>
> >> >>>          <jaxrs:properties>
> >> >>>              <entry key="schema-validation-enabled" value="true" />
> >> >>>          </jaxrs:properties>
> >> >>>          <jaxrs:schemaLocations>
> >> >>>
> >> >>>
> >>
> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
> >> >>> schemaLocation>
> >> >>>          </jaxrs:schemaLocations>
> >> >>>          <jaxrs:providers>
> >> >>>              <ref bean="exRSJsonProvider" />
> >> >>>              <ref bean="jaxbProvider" />"
> >> >>>              <ref bean="dateParamHandler" />
> >> >>>              <ref bean="timeParamHandler" />
> >> >>>          </jaxrs:providers>
> >> >>>
> >> >>>          ....................
> >> >>>          ....................
> >> >>> </jaxrs:server>
> >> >>>
> >> >>> Is this even possible to be done or should I just drop the idea?
> >> >>>
> >> >> Technically it is possible, we have tests where input JSON sequences
> are
> >> >> validated, it works with Jettison because they are eventually
> handled by
> >> >> JAXB.
> >> >>
> >> >> I'm presuming that the input JSON sequence has no namespace prefixes,
> >> >> right ? Does the JAX-RS resource method accepting a JAXB bean
> populated
> >> >> from such a sequence has a namespace property at all ?
> >> >>
> >> >> Or are you trying to validate output data by any chance ?
> >> >>
> >> >> Cheers, Sergey
> >> >>
> >> >>>
> >> >>> Cheers
> >> >>> Anders
> >> >>>
> >> >>>
> >> >>
> >> >>
> >> >>
> >>
>

Re: JSON, XSD and response validation

Posted by Jose María Zaragoza <de...@gmail.com>.
Can you paste your code  ?
So I can see the final solution

Regards

2013/12/11 Anders Clausen <an...@gmail.com>:
> Jose,
>
> that did the trick! I tried out the 'validateOutput' property on the JAXB
> provider and it works. I have to be honest and say that I didn't see that
> section on the page - thought it would have been before the stuff about
> 'catalogs' but that's just me;-)
>
> Thank you all for your quick replies - the solution has made my day!
>
> Cheers!
>
>
> On 11 December 2013 16:15, Jose María Zaragoza <de...@gmail.com> wrote:
>
>> Hi:
>>
>> I've never tried to enable schema validation to data output ( it
>> doesn't make sense *for me* )
>> Reading that webpage:
>>
>> - I think that
>>
>> <jaxrs:properties>
>>             <entry key="schema-validation-enabled" value="true" />
>> </jaxrs:properties>
>>
>> doesn't enable JAX-RS schema validation
>>
>>
>> - About that webpage
>>
>> "By default, after a valid schema has been located, only JAXB
>> Unmarshaller will use it to validate the input.
>> Starting from CXF 2.3.4 and 2.4, the following properties can be used
>> to enable the output validation:
>>
>> validateOutput
>> validateBeforeWrite
>>
>> Setting the 'validateOutput' property will ensure that JAXBMarshaller
>> will validate the output while writing the data. The
>> 'validateBeforeWrite' property can be set to ensure the validation is
>> done before data are written to the output stream."
>>
>> Did you test these properties ?
>>
>>
>>
>>
>>
>>
>> 2013/12/11 Anders Clausen <an...@gmail.com>:
>> > Hi Sergey
>> >
>> > Thanks for replying so quickly. Yes, it is the output data (the response
>> > sent back to the calling client) that we're trying to validate.
>> >
>> > Cheers
>> > Anders
>> >
>> >
>> > On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com>
>> wrote:
>> >
>> >> Hi
>> >>
>> >>
>> >> On 11/12/13 15:22, Anders Clausen wrote:
>> >>
>> >>> Hi
>> >>>
>> >>> I've only used CXF for a little while and still trying to find my way.
>> >>> I've
>> >>> got a question that I hope you can help me resolve. For our current
>> >>> project
>> >>> we expose a service both as REST and as SOAP. We have defined our
>> >>> interfaces through XSDs and use JAXB2. We want to turn on response
>> >>> validation during development time and have successfully done that for
>> our
>> >>> SOAP service, however, when it comes to our REST service I am not sure
>> if
>> >>> this can be done. How does JSON work with XSDs? I've been trying to
>> follow
>> >>> the guidelines from this page
>> >>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
>> >>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
>> >>>
>> >>> but
>> >>> without any luck.
>> >>>
>> >>> This is the code I've used:
>> >>>
>> >>>      <bean id="exRSJsonProvider"
>> >>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>> >>>          <property name="dropRootElement" value="false" />
>> >>>          <property name="supportUnwrapped" value="true" />
>> >>>          <property name="ignoreNamespaces" value="true" />
>> >>>          <property name="schemaHandler" ref="schemaHolder"/>
>> >>>      </bean>
>> >>>
>> >>>      <bean id="jaxbProvider"
>> >>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>> >>>          <property name="schemaHandler" ref="schemaHolder"/>
>> >>>      </bean>
>> >>>
>> >>>      <bean id="schemaHolder"
>> >>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
>> >>>          <property name="schemas" ref="theSchemas"/>
>> >>>      </bean>
>> >>>
>> >>>      <util:list id="theSchemas">
>> >>>          <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
>> >>>      </util:list>
>> >>>
>> >>>      <jaxrs:server name="exRSScheduleResource"
>> >>> address="${ex.rs.endpoint.address}">
>> >>>          <jaxrs:serviceBeans>
>> >>>              <bean
>> >>>                      class="com.ex.rs.ScheduleResource" />
>> >>>              <bean class="com.ex.rs.LocationResource" />
>> >>>          </jaxrs:serviceBeans>
>> >>>          <jaxrs:properties>
>> >>>              <entry key="schema-validation-enabled" value="true" />
>> >>>          </jaxrs:properties>
>> >>>          <jaxrs:schemaLocations>
>> >>>
>> >>>
>> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
>> >>> schemaLocation>
>> >>>          </jaxrs:schemaLocations>
>> >>>          <jaxrs:providers>
>> >>>              <ref bean="exRSJsonProvider" />
>> >>>              <ref bean="jaxbProvider" />"
>> >>>              <ref bean="dateParamHandler" />
>> >>>              <ref bean="timeParamHandler" />
>> >>>          </jaxrs:providers>
>> >>>
>> >>>          ....................
>> >>>          ....................
>> >>> </jaxrs:server>
>> >>>
>> >>> Is this even possible to be done or should I just drop the idea?
>> >>>
>> >> Technically it is possible, we have tests where input JSON sequences are
>> >> validated, it works with Jettison because they are eventually handled by
>> >> JAXB.
>> >>
>> >> I'm presuming that the input JSON sequence has no namespace prefixes,
>> >> right ? Does the JAX-RS resource method accepting a JAXB bean populated
>> >> from such a sequence has a namespace property at all ?
>> >>
>> >> Or are you trying to validate output data by any chance ?
>> >>
>> >> Cheers, Sergey
>> >>
>> >>>
>> >>> Cheers
>> >>> Anders
>> >>>
>> >>>
>> >>
>> >>
>> >>
>>

Re: JSON, XSD and response validation

Posted by Anders Clausen <an...@gmail.com>.
Jose,

that did the trick! I tried out the 'validateOutput' property on the JAXB
provider and it works. I have to be honest and say that I didn't see that
section on the page - thought it would have been before the stuff about
'catalogs' but that's just me;-)

Thank you all for your quick replies - the solution has made my day!

Cheers!


On 11 December 2013 16:15, Jose María Zaragoza <de...@gmail.com> wrote:

> Hi:
>
> I've never tried to enable schema validation to data output ( it
> doesn't make sense *for me* )
> Reading that webpage:
>
> - I think that
>
> <jaxrs:properties>
>             <entry key="schema-validation-enabled" value="true" />
> </jaxrs:properties>
>
> doesn't enable JAX-RS schema validation
>
>
> - About that webpage
>
> "By default, after a valid schema has been located, only JAXB
> Unmarshaller will use it to validate the input.
> Starting from CXF 2.3.4 and 2.4, the following properties can be used
> to enable the output validation:
>
> validateOutput
> validateBeforeWrite
>
> Setting the 'validateOutput' property will ensure that JAXBMarshaller
> will validate the output while writing the data. The
> 'validateBeforeWrite' property can be set to ensure the validation is
> done before data are written to the output stream."
>
> Did you test these properties ?
>
>
>
>
>
>
> 2013/12/11 Anders Clausen <an...@gmail.com>:
> > Hi Sergey
> >
> > Thanks for replying so quickly. Yes, it is the output data (the response
> > sent back to the calling client) that we're trying to validate.
> >
> > Cheers
> > Anders
> >
> >
> > On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com>
> wrote:
> >
> >> Hi
> >>
> >>
> >> On 11/12/13 15:22, Anders Clausen wrote:
> >>
> >>> Hi
> >>>
> >>> I've only used CXF for a little while and still trying to find my way.
> >>> I've
> >>> got a question that I hope you can help me resolve. For our current
> >>> project
> >>> we expose a service both as REST and as SOAP. We have defined our
> >>> interfaces through XSDs and use JAXB2. We want to turn on response
> >>> validation during development time and have successfully done that for
> our
> >>> SOAP service, however, when it comes to our REST service I am not sure
> if
> >>> this can be done. How does JSON work with XSDs? I've been trying to
> follow
> >>> the guidelines from this page
> >>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
> >>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
> >>>
> >>> but
> >>> without any luck.
> >>>
> >>> This is the code I've used:
> >>>
> >>>      <bean id="exRSJsonProvider"
> >>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
> >>>          <property name="dropRootElement" value="false" />
> >>>          <property name="supportUnwrapped" value="true" />
> >>>          <property name="ignoreNamespaces" value="true" />
> >>>          <property name="schemaHandler" ref="schemaHolder"/>
> >>>      </bean>
> >>>
> >>>      <bean id="jaxbProvider"
> >>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
> >>>          <property name="schemaHandler" ref="schemaHolder"/>
> >>>      </bean>
> >>>
> >>>      <bean id="schemaHolder"
> >>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
> >>>          <property name="schemas" ref="theSchemas"/>
> >>>      </bean>
> >>>
> >>>      <util:list id="theSchemas">
> >>>          <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
> >>>      </util:list>
> >>>
> >>>      <jaxrs:server name="exRSScheduleResource"
> >>> address="${ex.rs.endpoint.address}">
> >>>          <jaxrs:serviceBeans>
> >>>              <bean
> >>>                      class="com.ex.rs.ScheduleResource" />
> >>>              <bean class="com.ex.rs.LocationResource" />
> >>>          </jaxrs:serviceBeans>
> >>>          <jaxrs:properties>
> >>>              <entry key="schema-validation-enabled" value="true" />
> >>>          </jaxrs:properties>
> >>>          <jaxrs:schemaLocations>
> >>>
> >>>
> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
> >>> schemaLocation>
> >>>          </jaxrs:schemaLocations>
> >>>          <jaxrs:providers>
> >>>              <ref bean="exRSJsonProvider" />
> >>>              <ref bean="jaxbProvider" />"
> >>>              <ref bean="dateParamHandler" />
> >>>              <ref bean="timeParamHandler" />
> >>>          </jaxrs:providers>
> >>>
> >>>          ....................
> >>>          ....................
> >>> </jaxrs:server>
> >>>
> >>> Is this even possible to be done or should I just drop the idea?
> >>>
> >> Technically it is possible, we have tests where input JSON sequences are
> >> validated, it works with Jettison because they are eventually handled by
> >> JAXB.
> >>
> >> I'm presuming that the input JSON sequence has no namespace prefixes,
> >> right ? Does the JAX-RS resource method accepting a JAXB bean populated
> >> from such a sequence has a namespace property at all ?
> >>
> >> Or are you trying to validate output data by any chance ?
> >>
> >> Cheers, Sergey
> >>
> >>>
> >>> Cheers
> >>> Anders
> >>>
> >>>
> >>
> >>
> >>
>

Re: JSON, XSD and response validation

Posted by Jose María Zaragoza <de...@gmail.com>.
Hi:

I've never tried to enable schema validation to data output ( it
doesn't make sense *for me* )
Reading that webpage:

- I think that

<jaxrs:properties>
            <entry key="schema-validation-enabled" value="true" />
</jaxrs:properties>

doesn't enable JAX-RS schema validation


- About that webpage

"By default, after a valid schema has been located, only JAXB
Unmarshaller will use it to validate the input.
Starting from CXF 2.3.4 and 2.4, the following properties can be used
to enable the output validation:

validateOutput
validateBeforeWrite

Setting the 'validateOutput' property will ensure that JAXBMarshaller
will validate the output while writing the data. The
'validateBeforeWrite' property can be set to ensure the validation is
done before data are written to the output stream."

Did you test these properties ?






2013/12/11 Anders Clausen <an...@gmail.com>:
> Hi Sergey
>
> Thanks for replying so quickly. Yes, it is the output data (the response
> sent back to the calling client) that we're trying to validate.
>
> Cheers
> Anders
>
>
> On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com> wrote:
>
>> Hi
>>
>>
>> On 11/12/13 15:22, Anders Clausen wrote:
>>
>>> Hi
>>>
>>> I've only used CXF for a little while and still trying to find my way.
>>> I've
>>> got a question that I hope you can help me resolve. For our current
>>> project
>>> we expose a service both as REST and as SOAP. We have defined our
>>> interfaces through XSDs and use JAXB2. We want to turn on response
>>> validation during development time and have successfully done that for our
>>> SOAP service, however, when it comes to our REST service I am not sure if
>>> this can be done. How does JSON work with XSDs? I've been trying to follow
>>> the guidelines from this page
>>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
>>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
>>>
>>> but
>>> without any luck.
>>>
>>> This is the code I've used:
>>>
>>>      <bean id="exRSJsonProvider"
>>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>>>          <property name="dropRootElement" value="false" />
>>>          <property name="supportUnwrapped" value="true" />
>>>          <property name="ignoreNamespaces" value="true" />
>>>          <property name="schemaHandler" ref="schemaHolder"/>
>>>      </bean>
>>>
>>>      <bean id="jaxbProvider"
>>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>>>          <property name="schemaHandler" ref="schemaHolder"/>
>>>      </bean>
>>>
>>>      <bean id="schemaHolder"
>>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
>>>          <property name="schemas" ref="theSchemas"/>
>>>      </bean>
>>>
>>>      <util:list id="theSchemas">
>>>          <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
>>>      </util:list>
>>>
>>>      <jaxrs:server name="exRSScheduleResource"
>>> address="${ex.rs.endpoint.address}">
>>>          <jaxrs:serviceBeans>
>>>              <bean
>>>                      class="com.ex.rs.ScheduleResource" />
>>>              <bean class="com.ex.rs.LocationResource" />
>>>          </jaxrs:serviceBeans>
>>>          <jaxrs:properties>
>>>              <entry key="schema-validation-enabled" value="true" />
>>>          </jaxrs:properties>
>>>          <jaxrs:schemaLocations>
>>>
>>> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
>>> schemaLocation>
>>>          </jaxrs:schemaLocations>
>>>          <jaxrs:providers>
>>>              <ref bean="exRSJsonProvider" />
>>>              <ref bean="jaxbProvider" />"
>>>              <ref bean="dateParamHandler" />
>>>              <ref bean="timeParamHandler" />
>>>          </jaxrs:providers>
>>>
>>>          ....................
>>>          ....................
>>> </jaxrs:server>
>>>
>>> Is this even possible to be done or should I just drop the idea?
>>>
>> Technically it is possible, we have tests where input JSON sequences are
>> validated, it works with Jettison because they are eventually handled by
>> JAXB.
>>
>> I'm presuming that the input JSON sequence has no namespace prefixes,
>> right ? Does the JAX-RS resource method accepting a JAXB bean populated
>> from such a sequence has a namespace property at all ?
>>
>> Or are you trying to validate output data by any chance ?
>>
>> Cheers, Sergey
>>
>>>
>>> Cheers
>>> Anders
>>>
>>>
>>
>>
>>

Re: JSON, XSD and response validation

Posted by Anders Clausen <an...@gmail.com>.
Hi Sergey

Thanks for replying so quickly. Yes, it is the output data (the response
sent back to the calling client) that we're trying to validate.

Cheers
Anders


On 11 December 2013 15:45, Sergey Beryozkin <sb...@gmail.com> wrote:

> Hi
>
>
> On 11/12/13 15:22, Anders Clausen wrote:
>
>> Hi
>>
>> I've only used CXF for a little while and still trying to find my way.
>> I've
>> got a question that I hope you can help me resolve. For our current
>> project
>> we expose a service both as REST and as SOAP. We have defined our
>> interfaces through XSDs and use JAXB2. We want to turn on response
>> validation during development time and have successfully done that for our
>> SOAP service, however, when it comes to our REST service I am not sure if
>> this can be done. How does JSON work with XSDs? I've been trying to follow
>> the guidelines from this page
>> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/
>> JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
>>
>> but
>> without any luck.
>>
>> This is the code I've used:
>>
>>      <bean id="exRSJsonProvider"
>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>>          <property name="dropRootElement" value="false" />
>>          <property name="supportUnwrapped" value="true" />
>>          <property name="ignoreNamespaces" value="true" />
>>          <property name="schemaHandler" ref="schemaHolder"/>
>>      </bean>
>>
>>      <bean id="jaxbProvider"
>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>>          <property name="schemaHandler" ref="schemaHolder"/>
>>      </bean>
>>
>>      <bean id="schemaHolder"
>> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
>>          <property name="schemas" ref="theSchemas"/>
>>      </bean>
>>
>>      <util:list id="theSchemas">
>>          <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
>>      </util:list>
>>
>>      <jaxrs:server name="exRSScheduleResource"
>> address="${ex.rs.endpoint.address}">
>>          <jaxrs:serviceBeans>
>>              <bean
>>                      class="com.ex.rs.ScheduleResource" />
>>              <bean class="com.ex.rs.LocationResource" />
>>          </jaxrs:serviceBeans>
>>          <jaxrs:properties>
>>              <entry key="schema-validation-enabled" value="true" />
>>          </jaxrs:properties>
>>          <jaxrs:schemaLocations>
>>
>> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:
>> schemaLocation>
>>          </jaxrs:schemaLocations>
>>          <jaxrs:providers>
>>              <ref bean="exRSJsonProvider" />
>>              <ref bean="jaxbProvider" />"
>>              <ref bean="dateParamHandler" />
>>              <ref bean="timeParamHandler" />
>>          </jaxrs:providers>
>>
>>          ....................
>>          ....................
>> </jaxrs:server>
>>
>> Is this even possible to be done or should I just drop the idea?
>>
> Technically it is possible, we have tests where input JSON sequences are
> validated, it works with Jettison because they are eventually handled by
> JAXB.
>
> I'm presuming that the input JSON sequence has no namespace prefixes,
> right ? Does the JAX-RS resource method accepting a JAXB bean populated
> from such a sequence has a namespace property at all ?
>
> Or are you trying to validate output data by any chance ?
>
> Cheers, Sergey
>
>>
>> Cheers
>> Anders
>>
>>
>
>
>

Re: JSON, XSD and response validation

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi

On 11/12/13 15:22, Anders Clausen wrote:
> Hi
>
> I've only used CXF for a little while and still trying to find my way. I've
> got a question that I hope you can help me resolve. For our current project
> we expose a service both as REST and as SOAP. We have defined our
> interfaces through XSDs and use JAXB2. We want to turn on response
> validation during development time and have successfully done that for our
> SOAP service, however, when it comes to our REST service I am not sure if
> this can be done. How does JSON work with XSDs? I've been trying to follow
> the guidelines from this page
> CXF<https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Data+Bindings#JAX-RSDataBindings-Schemavalidation>
> but
> without any luck.
>
> This is the code I've used:
>
>      <bean id="exRSJsonProvider"
> class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
>          <property name="dropRootElement" value="false" />
>          <property name="supportUnwrapped" value="true" />
>          <property name="ignoreNamespaces" value="true" />
>          <property name="schemaHandler" ref="schemaHolder"/>
>      </bean>
>
>      <bean id="jaxbProvider"
> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>          <property name="schemaHandler" ref="schemaHolder"/>
>      </bean>
>
>      <bean id="schemaHolder"
> class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler">
>          <property name="schemas" ref="theSchemas"/>
>      </bean>
>
>      <util:list id="theSchemas">
>          <value>classpath:webapi/xsd/GetSchedulesV01_C.xsd</value>
>      </util:list>
>
>      <jaxrs:server name="exRSScheduleResource"
> address="${ex.rs.endpoint.address}">
>          <jaxrs:serviceBeans>
>              <bean
>                      class="com.ex.rs.ScheduleResource" />
>              <bean class="com.ex.rs.LocationResource" />
>          </jaxrs:serviceBeans>
>          <jaxrs:properties>
>              <entry key="schema-validation-enabled" value="true" />
>          </jaxrs:properties>
>          <jaxrs:schemaLocations>
>
> <jaxrs:schemaLocation>classpath:/webapi/xsd/GetSchedulesV01_C.xsd</jaxrs:schemaLocation>
>          </jaxrs:schemaLocations>
>          <jaxrs:providers>
>              <ref bean="exRSJsonProvider" />
>              <ref bean="jaxbProvider" />"
>              <ref bean="dateParamHandler" />
>              <ref bean="timeParamHandler" />
>          </jaxrs:providers>
>
>          ....................
>          ....................
> </jaxrs:server>
>
> Is this even possible to be done or should I just drop the idea?
Technically it is possible, we have tests where input JSON sequences are 
validated, it works with Jettison because they are eventually handled by 
JAXB.

I'm presuming that the input JSON sequence has no namespace prefixes, 
right ? Does the JAX-RS resource method accepting a JAXB bean populated 
from such a sequence has a namespace property at all ?

Or are you trying to validate output data by any chance ?

Cheers, Sergey
>
> Cheers
> Anders
>