Hi Sam At the moment you need to explicitly register an org.apache.cxf.jaxrs.provider.JSONProvider bean and configure it with a namespaceMap map property, see here for example :
http://svn.apache.org/repos/asf/cxf/trunk/systests/src/test/resources/jaxrs/WEB-INF/beans.xml This map should include "http://www.w3.org/2001/XMLSchema-instance" as a key and either "xsi" as a value. New JSON providers such as AegisJSONProvider and DataBindingJSONProvider actually do it by default - I'll update a JSONProvider to do it too - it really won't harm, but in meantime please do it manually... cheers, Sergey Sam.Wang wrote: > > Hi dkulp: > > Thanks your reply! > I was tried your method, however I get an exception when the response > message be serialized in JAXRSOutInterceptor class. I debug it and find > out the detailed exception info. > > javax.ws.rs.WebApplicationException: java.lang.IllegalStateException: > Invalid JSON namespace: http://www.w3.org/2001/XMLSchema-instance > > I only added the annotation in CRUDResponse class, just like this: > > @XmlRootElement(name = "response") > @XmlSeeAlso( { Apple.class }) > public class CRUDResponse <T extends Object> { > > Are there others specific reasons in my code? > thanks, Sam. > > > dkulp wrote: >> >> >> Well, the basic reason is that many of the generic types get compiled >> away and >> thus are not able to be discovered via reflection. In your case: >> >> new CRUDResponse<Apple>(apple) >> >> The "Apple" gets compiled away to just Object. When we create the >> JAXBContext, Apple doesn't get added and thus it's now able to write it. >> The >> normal way around it is to add @XmlSeeAlso annotations to places JAXB >> would >> look. In your case, I THINK if you add an XmlSeeAlso annotation to the >> CRUDResponse that points at all the objects that it could hold, you >> should be >> OK. >> >> Dan >> >> >> On Mon August 17 2009 6:11:59 am Sam.Wang wrote: >>> I found this issue today, but I don't understand why? >>> >>> 2009-8-17 18:05:09 org.apache.cxf.jaxrs.provider.AbstractJAXBProvider >>> handleJAXBException >>> Warning: javax.xml.bind.MarshalException >>> - with linked exception: >>> [javax.xml.bind.JAXBException: class com.demo.Apple nor any of its super >>> class is known to this context.] >>> >>> Following is my demo code: >>> >>> @XmlRootElement(name = "apple") >>> public class Apple { >>> >>> private int id = -1; >>> private String name; >>> private String color; >>> private int size; >>> >>> set... >>> get... >>> } >>> >>> >>> @XmlRootElement(name = "response") >>> public class CRUDResponse<T extends Object> { >>> >>> private int total; >>> private int limit; >>> private int start; >>> private boolean success = true; >>> private T entity; >>> private List<T> entityList; >>> >>> set... >>> get... >>> } >>> >>> public Response getApple(String id) throws Exception { >>> Apple apple = new >>> AppleServiceImpl().getApple(Integer.parseInt(id)); >>> return Response.ok(new CRUDResponse<Apple>(apple)).build(); >>> } >> >> -- >> Daniel Kulp >> [email protected] >> http://www.dankulp.com/blog >> >> > > -- View this message in context: http://www.nabble.com/Exception-about-%22***-nor-any-of-its-super-class-is-known-to-this-context%22-tp25004234p25062261.html Sent from the cxf-user mailing list archive at Nabble.com.
