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 <[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
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com