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.

Reply via email to