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 <[email protected]> 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 <[email protected]>:
> > 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 <[email protected]>
> wrote:
> >
> >> Can you paste your code  ?
> >> So I can see the final solution
> >>
> >> Regards
> >>
> >> 2013/12/11 Anders Clausen <[email protected]>:
> >> > 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 <[email protected]>
> >> 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 <[email protected]>:
> >> >> > 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 <[email protected]>
> >> >> 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
> >> >> >>>
> >> >> >>>
> >> >> >>
> >> >> >>
> >> >> >>
> >> >>
> >>
>

Reply via email to