Hi - please do, so I may get it fixed shortly. Generally speaking, given that I do not have time to look into the code during the working day, I do not prioritize on issues for which a reasonable workaround exists, but I can see that the fix can be trivial in this case :-),
cheers, Sergey On Tue, Jun 22, 2010 at 11:26 PM, peter.giles <[email protected]>wrote: > > Hi Sergey, > > Thank you for clearing that up for me :-) > > Should I file a feature request to have JAXBElementProvider look for > @XmlJavaTypeAdapter on the interfaces? > > Cheers, > Peter > > > > Sergey Beryozkin-5 wrote: > > > > Hi > > > > At the moment JAXBElementProvider is capable of working with > > @XmlJavaTypeAdapter but it does not check the interfaces. The workaround > : > > add @XmlJavaTypeAdapter as a method annotation to getAll() or to > > BaseballCardImpl > > > > Regarding the limited WADL description : the generator can not get much > > info > > from the BaseballCard interface, so you may want to add > > org.apache.cxf.jaxrs.ext.xml.XmlName annotation to it... > > > > cheers, Sergey > > > > On Wed, Jun 16, 2010 at 7:09 PM, Daniel Kulp <[email protected]> wrote: > > > >> > >> This is probably a bug in the CXF JAXB Provider. It's probably just > >> grabbing > >> the "raw" class files and not really looking for the XmlJavaTypeAdapter > >> things. Can you create a small test case and attach to a JIRA? > >> > >> Dan > >> > >> > >> On Tuesday 15 June 2010 3:49:04 pm peter.giles wrote: > >> > Hello CXF cognoscenti, > >> > > >> > I'm trying to get a test service working that uses an interface for my > >> > return type and am running into trouble. I am under the possibly > false > >> > impression that I should be able to get this to work using an > >> > @XmlJavaTypeAdapter (JAXB style -- see > >> > > >> > https://jaxb.dev.java.net/guide/Mapping_interfaces.html#Use__XmlJavaTypeAda > >> > pter). When I try to access my service I get "JAXBException occurred : > >> 2 > >> > counts of IllegalAnnotationExceptions. " Here's the error from tomcat > >> log > >> > with hopefully enough stack context: > >> > > >> > Jun 15, 2010 11:59:14 AM > >> org.apache.cxf.jaxrs.provider.AbstractJAXBProvider > >> > handleJAXBException > >> > WARNING: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 > >> counts > >> > of IllegalAnnotationExceptions > >> > service.BaseballCard is an interface, and JAXB can't handle > interfaces. > >> > this problem is related to the following location: > >> > at service.BaseballCard > >> > service.BaseballCard does not have a no-arg default constructor. > >> > this problem is related to the following location: > >> > at service.BaseballCard > >> > > >> > at > >> > > >> > com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Illeg > >> > alAnnotationsException.java:102) at > >> > > >> > com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl. > >> > java:472) at > >> > > >> > com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302 > >> > ) at > >> > > >> > com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBCo > >> > ntextImpl.java:1136) at > >> > > >> > com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154) > >> > at > >> > > >> > com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121) > >> > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > >> > at > >> > > >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3 > >> > 9) at > >> > > >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp > >> > l.java:25) at java.lang.reflect.Method.invoke(Method.java:597) > >> > at > >> javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202) > >> > at javax.xml.bind.ContextFinder.find(ContextFinder.java:363) > >> > at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) > >> > at > >> > > >> > org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.getClassContext(Abstract > >> > JAXBProvider.java:351) at > >> > > >> > org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.getJAXBContext(AbstractJ > >> > AXBProvider.java:344) at > >> > > >> > org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.getJaxbQName(AbstractJAX > >> > BProvider.java:258) at > >> > > >> > org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.getCollectionWrapperQNam > >> > e(AbstractJAXBProvider.java:221) at > >> > > >> > org.apache.cxf.jaxrs.provider.JAXBElementProvider.marshalCollection(JAXBEle > >> > mentProvider.java:258) at > >> > > >> > org.apache.cxf.jaxrs.provider.JAXBElementProvider.writeTo(JAXBElementProvid > >> > er.java:233) at > >> > > >> > org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRS > >> > OutInterceptor.java:241) *snip* > >> > > >> > I thought this was what the type adapter was supposed to take care of > >> -- > >> do > >> > I need to do something special to point out the type adapter to CXF? > I > >> > apologize for the amount of code here, but I've stripped my test to > the > >> > bare minimum. Here it is: > >> > > >> > @Path("/collection/") @Produces("application/xml") > >> > public interface BaseballCardCollectionService { > >> > > >> > @GET > >> > public List<BaseballCard> getAll(); > >> > > >> > @POST > >> > @Path("/BaseballCard") > >> > public Integer add(BaseballCard card); > >> > } > >> > > >> > @XmlJavaTypeAdapter(BaseballCardImpl.BaseballCardAdapter.class) > >> > public interface BaseballCard { > >> > > >> > public String getPlayerName(); > >> > public String getCardType(); > >> > public Integer getYear(); > >> > > >> > } > >> > > >> > @XmlRootElement > >> > public class BaseballCardImpl implements BaseballCard { > >> > > >> > private String cardType; > >> > private String playerName; > >> > private Integer year; > >> > > >> > public BaseballCardImpl() {} > >> > > >> > public BaseballCardImpl(String playerName, String cardType, > Integer > >> > year) { > >> > this.playerName = playerName; > >> > this.cardType = cardType; > >> > this.year = year; > >> > } > >> > > >> > public void setCardType(String cardType) { this.cardType = > >> cardType; > >> } > >> > public void setPlayerName(String playerName) { this.playerName = > >> > playerName; } > >> > public void setYear(Integer year) { this.year = year; } > >> > public String getCardType() { return cardType; } > >> > public String getPlayerName() { return playerName; } > >> > public Integer getYear() { return year; }; > >> > > >> > public static class BaseballCardAdapter extends > >> > XmlAdapter<BaseballCardImpl, BaseballCard> { > >> > > >> > @Override > >> > public BaseballCardImpl marshal(BaseballCard v) throws > >> Exception > >> { > >> > return new BaseballCardImpl(v.getPlayerName(), > >> v.getCardType(), > >> > v.getYear()); > >> > } > >> > > >> > @Override > >> > public BaseballCard unmarshal(BaseballCardImpl v) throws > >> Exception > >> > { return v; } > >> > } > >> > } > >> > > >> > public class BaseballCardCollectionServiceImpl implements > >> > BaseballCardCollectionService { > >> > > >> > private Map<Integer, BaseballCard> cards = new > >> > ConcurrentHashMap<Integer, BaseballCard>(); > >> > private AtomicInteger nextId = new AtomicInteger(1); > >> > > >> > public BaseballCardCollectionServiceImpl() { > >> > add(new BaseballCardImpl("Leroy Paige", "Leaf", 1949)); > >> > } > >> > > >> > public Integer add(BaseballCard card) { > >> > Integer result = null; > >> > if (card != null) { > >> > int id = nextId.addAndGet(1); > >> > cards.put(id, card); > >> > result = id; > >> > } > >> > return result; > >> > } > >> > > >> > public List<BaseballCard> getAll() { > >> > return new ArrayList<BaseballCard>(cards.values()); > >> > } > >> > > >> > } > >> > > >> > Here is the important part of my spring config: > >> > > >> > <import resource="classpath:META-INF/cxf/cxf.xml" /> > >> > <import > >> > resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" /> > >> > <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> > >> > > >> > <jaxrs:server id="collectionService" address="/"> > >> > <jaxrs:serviceBeans> > >> > <ref bean="collectionImpl" /> > >> > </jaxrs:serviceBeans> > >> > <jaxrs:extensionMappings> > >> > <entry key="xml" value="application/xml" /> > >> > </jaxrs:extensionMappings> > >> > </jaxrs:server> > >> > > >> > <bean id="collectionImpl" > >> > class="service.BaseballCardCollectionServiceImpl" /> > >> > > >> > The URL I'm hitting for my service is > >> > http://localhost:8080/cxf-rest-example/collection/ which gives me the > >> short > >> > version of the error message. I can see the wadl at > >> > http://localhost:8080/cxf-rest-example/collection?_wadl&_type=xml but > I > >> > must admit that I don't know anything about wadl so I am not getting > >> any > >> > clues from it: > >> > > >> > <application> > >> > <grammars/> > >> > <resources base="http://localhost:8080/cxf-rest-example/"> > >> > <resource path="/collection/"> > >> > <method name="GET"> > >> > <response> > >> > <representation mediaType="application/xml"/> > >> > </response> > >> > </method> > >> > <resource path="BaseballCard"> > >> > <method name="POST"> > >> > <request> > >> > <representation mediaType="*/*"/> > >> > </request> > >> > <response> > >> > <!-- Primitive type : xs:int --> > >> > <representation mediaType="application/xml"/> > >> > </response> > >> > </method> > >> > </resource> > >> > </resource> > >> > </resources> > >> > </application> > >> > > >> > Does anybody see what am I doing wrong? > >> > > >> > Thank you! > >> > Peter Giles > >> > >> -- > >> Daniel Kulp > >> [email protected] > >> http://dankulp.com/blog > >> > > > > > > -- > View this message in context: > http://old.nabble.com/JAX-RS-service-w--interface-result-type%2C--%40XmlJavaTypeAdapter-tp28895564p28965814.html > Sent from the cxf-user mailing list archive at Nabble.com. > >
