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 > >> >> >>> > >> >> >>> > >> >> >> > >> >> >> > >> >> >> > >> >> > >> >
