Hello Sergey: Thanks your reply and supports! According to your method, I updated it and it works fine. So now I can use the generic type to help me to implement a flexible and beautiful structure.
Thanks so much! Sam Sergey Beryozkin wrote: > > 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-tp25004234p25110268.html Sent from the cxf-user mailing list archive at Nabble.com.
