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.
>
>

Reply via email to