In the end it proved to be a rather strange Jettison bug :

http://jira.codehaus.org/browse/JETTISON-82

so now I have a list of about 4 bugs which I hope will eventually be fixed
for 1.1.2

Here's how you can workaround it :

public class DropXSIAttributeWriter extends DelegatingXMLStreamWriter {
        public DropXSIAttributeWriter(XMLStreamWriter writer) {
            super(writer);
        }
        
        public void writeAttribute(String prefix, String uri, 
                                   String local, String value) throws
XMLStreamException {
            if (local.equals("type") && prefix.equals("xsi")) {
                return;
            }
            super.writeAttribute(prefix, uri, local, value);
        }
    }

JSONProvider p = new JSONProvider() {
            @Override
            protected XMLStreamWriter createWriter(Object actualObject,
Class<?> actualClass, 
                                                   Type genericType, String
enc, OutputStream os, boolean isCollection) throws Exception {     
                XMLStreamWriter writer = super.createWriter(actualObject,
actualClass, genericType, 
                                                            enc, os,
isCollection);
                
                return new DropXSIAttributeWriter(writer);
            }
        };

and then proceed setting the provider properties as before.

thanks, Sergey


Sergey Beryozkin wrote:
> 
> Having said that, I think the problem may be to do with the fact that
> you've configured the provider to drop a root element but the provider
> still 'leaks' attributes such as 'xsi:type' which belong to that root
> element and makes them available to the underlying (Jettison) writer. I'll
> fix it and then let you know how you can do it with the custom
> JSONProvider as well...
> 
> cheers, Sergey
>  
> 
> Sergey Beryozkin wrote:
>> 
>> Hi Sam
>> 
>> So does it work before you set a namespaceMap ? In other words, how do
>> you obtain JSON data given that a JSONProvider reports the problem with
>> the missing xsi namespace ?
>> 
>> thanks, Sergey
>> 
>> 
>> Sam.Wang wrote:
>>> 
>>> Hi Sergey:
>>> 
>>> Thanks your reply!
>>> Follow your said, I configured a namsepaceMap to JSONProvider and it
>>> works.
>>> But there is a little issue about Serialize Array, my mean is this
>>> feature doesn't work. Following is my code:
>>> 
>>>             JSONProvider jp = new JSONProvider();
>>>             jp.setCollectionWrapperName("list");
>>>             jp.setSerializeAsArray(true);
>>> 
>>>             List<String> arrayKeys=new ArrayList<String>();
>>>             arrayKeys.add("entityList");
>>>             jp.setArrayKeys(arrayKeys);
>>>             jp.setDropRootElement(true);
>>> 
>>>             Map<String,String> map=new HashMap<String, String>();
>>>             map.put("http://www.w3.org/2001/XMLSchema-instance";, "xsins");
>>>             jp.setNamespaceMap(map);
>>> 
>>>             List listProviders = new ArrayList();
>>>             listProviders.add(jp);
>>>             listProviders.add(new GenericExceptionMapper());
>>> 
>>>             sf.setProviders(listProviders);
>>> 
>>> The JSonData before configuring namespace:
>>> {"entityList":[{"color":"red","id":1,"name":"apple_1","size":1}],"limit":0,"start":0,"success":true,"total":1}
>>> 
>>> After:
>>> {"entityList":{"@xsins.type":"apple","color":"red","id":1,"name":"apple_1","size":1},"limit":0,"start":0,"success":true,"total":1}
>>> 
>>> Is it a little bug? or something wrong in my code?
>>> Thanks, Sam.
>>> 
>>> 
>>> Sergey Beryozkin wrote:
>>>> 
>>>> I added 'ether' there without completing the sentence... If you parse
>>>> JSON manually on the client side then you may want to specify an empty
>>>> prefix for "http://www.w3.org/2001/XMLSchema-instance";
>>>> 
>>>> cheers, Sergey
>>>> 
>>>> 
>>>> Sergey Beryozkin wrote:
>>>>> 
>>>>> 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-tp25004234p25079217.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to