Hi Sergey,

Yes it works! I have declared like this :

---------------------------------------------------------------------------
<entry key="org.apache.cxf.rs.provider" >
                <array>
                    <ref bean="jsonProvider" />
                    <ref bean="jaxbProvider" />
                </array>
            </entry>
---------------------------------------------------------------------------

Here my full spring.xml :

-----------------------------------------
    <osgi:reference id="userService"
interface="org.akrogen.services.UserService" />
    <osgi:service interface="org.akrogen.services.UserService">
        <osgi:service-properties>
            <entry key="service.exported.interfaces" value="*" />
            <entry key="service.exported.configs" value="org.apache.cxf.rs"
/>
            <entry key="org.apache.cxf.rs.provider" >
                <array>
                    <ref bean="jsonProvider" />
                    <ref bean="jaxbProvider" />
                </array>
            </entry>
            <entry key="service.exported.intents" value="HTTP" />
            <entry key="org.apache.cxf.rs.address" value="
http://localhost:9090/a"; />
            <entry key="org.apache.cxf.rs.databinding" value="jaxb" />
            <!-- <entry key="org.apache.cxf.rs.httpservice.context"
value="/rest"
                /> -->
        </osgi:service-properties>
        <ref bean="userService" />
    </osgi:service>


    <bean id="jsonProvider"
class="org.apache.cxf.jaxrs.provider.JSONProvider">
        <property name="singleJaxbContext" value="true" />
        <property name="extraClass">
            <list>
                <value>org.akrogen.domain.User</value>
            </list>
        </property>
    </bean>

    <bean id="jaxbProvider"
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
        <property name="singleJaxbContext" value="true" />
        <property name="extraClass">
            <list>
                <value>org.akrogen.domain.User</value>
            </list>
        </property>
    </bean>
-----------------------------------------

But I think if we fix the 2) problem (*AbstractJAXBProvider* should
populate Generic Type), I will avoid doing that.

Many thanks Sergey!

Regards Angelo

Le 19 mars 2012 22:42, Sergey Beryozkin <[email protected]> a écrit :

> Hi Dan, Angelo
>
> Having references to beans is also supported in DOSGI CXF 1.3,
>
> Please see the example from Jeff at the very top here:
>
> http://cxf.547215.n5.nabble.**com/Custom-interceptors-with-**
> DOSGi-td5143924.html#a5152563<http://cxf.547215.n5.nabble.com/Custom-interceptors-with-DOSGi-td5143924.html#a5152563>
>
> The same should would for rs providers
>
> Angelo, can you try it please ?
>
> Thanks, Sergey
>
>
> On 19/03/12 15:49, Daniel Kulp wrote:
>
>>
>>
>> For (1), you may be able to just add @XmlSeeAlso annotation onto the the
>> @Page class to point at the various other types.   When working with
>> subclasses in JAXB, you have to do the same thing to let JAXB know about
>> the
>> potential subclasses and such.  Thus, that alone may fix that issue.   Not
>> really sure though.
>>
>> (2) sounds like a potential enhancement.   Patches are more than welcome.
>> :-)
>>
>>
>> Dan
>>
>>
>>
>> On Sunday, March 18, 2012 12:52:15 PM Angelo zerr wrote:
>>
>>> Hi CXF Team,
>>>
>>> I have a problem with JAXBContext with type of class MyClass<T>. When I
>>> have MyClass<MySecondClass>, JAXBContext is poupulated with only MyClass
>>> and not with MySecondClass.
>>> I have resolved my problem, but I find it's not a clean solution.
>>>
>>> Let's me explain more my case.
>>>
>>> I have a service wich uses Spring Data Page+Pageable (to manage
>>> pagination
>>> with Spring Data JPA) in OSGi context :
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**---------------- package
>>> org.akrogen.services;
>>>
>>> import org.akrogen.domain.User;
>>> import org.springframework.data.**domain.Page;
>>> import org.springframework.data.**domain.Pageable;
>>>
>>> public interface UserService {
>>>
>>>     Page<User>  findAll(Pageable pageable);
>>> }
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**----------------
>>>
>>> I wish call this services with remoting by using DOSGi with REST (I'm
>>> using JSONProvider). So I have created XmlAdapter for Spring Data
>>> Page+Pageable + add REST annotations :
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**---------------- package
>>> org.akrogen.services;
>>>
>>> import javax.ws.rs.GET;
>>> import javax.ws.rs.Path;
>>> import javax.ws.rs.PathParam;
>>> import javax.ws.rs.Produces;
>>> import javax.xml.bind.annotation.**adapters.XmlJavaTypeAdapter;
>>>
>>> import org.akrogen.domain.User;
>>> import org.akrogen.services.adapater.**PageXmlAdapter;
>>> import org.akrogen.services.adapater.**PageableXmlAdapter;
>>> import org.springframework.data.**domain.Page;
>>> import org.springframework.data.**domain.Pageable;
>>>
>>> @Path("/user")
>>> public interface UserService {
>>>
>>>
>>>     @GET
>>>     @Path("/findAll/{pageable}")
>>>     @Produces("application/json")
>>>     @XmlJavaTypeAdapter(**PageXmlAdapter.class)
>>>     Page<User>  findAll(@XmlJavaTypeAdapter(**PageableXmlAdapter.class)
>>> @PathParam("pageable")
>>>       Pageable pageable);
>>>
>>> }
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**----------------
>>>
>>> To export my service (with REST) I use DOSGi :
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**----------------<osgi:**reference
>>> id="userService"
>>> interface="org.akrogen.**services.UserService" />
>>>     <osgi:service interface="org.akrogen.**services.UserService">
>>>         <osgi:service-properties>
>>>             <entry key="service.exported.**interfaces" value="*" />
>>>             <entry key="service.exported.configs"
>>> value="org.apache.cxf.rs" />
>>>             <entry key="service.exported.intents" value="HTTP" />
>>>             <entry key="org.apache.cxf.rs.**address" value="
>>> http://localhost:9090/a"; />
>>>             <entry key="org.apache.cxf.rs.**databinding" value="jaxb" />
>>>         </osgi:service-properties>
>>>         <ref bean="userService" />
>>>     </osgi:service>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**----------------
>>>
>>> So the provider used is the default Jettison JSONProvider.
>>> When I access to my service I have this error :
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**---------------- JAXBException occurred
>>> :
>>> class org.akrogen.domain.User nor any of its super class is known to this
>>> context.. class org.akrogen.domain.User nor any of its super class is
>>> known to this context..
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**----------------
>>>
>>> Which means that JAXBContext is not populate with User class. To resolve
>>> my problem, I has to create My own JSONProvider wich add extra classes :
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**----------------
>>>
>>> package org.akrogen.cxf;
>>>
>>> import org.akrogen.domain.User;
>>> import org.apache.cxf.jaxrs.provider.**JSONProvider;
>>>
>>> public class MyJSONProvider extends JSONProvider {
>>>
>>>     public MyJSONProvider() {
>>>         Class[] userExtraClass = new Class[1];
>>>         userExtraClass[0] = User.class;
>>>         super.setExtraClass(**userExtraClass);
>>>     }
>>>
>>> }
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ------------------------------**----------------
>>>
>>> And I use it like this :
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ---------------
>>>
>>> <osgi:service interface="org.akrogen.**services.UserService">
>>>                <osgi:service-properties>
>>>                        <entry key="service.exported.**interfaces"
>>> value="*" />
>>>                        <entry key="service.exported.configs"
>>>
>> value="org.apache.cxf.rs" />
>>
>>>
>>>                        *<entry key="org.apache.cxf.rs.**provider"
>>> value="org.akrogen.cxf.**MyJSONProvider"
>>>                                />  *
>>>                        <entry key="service.exported.intents"
>>> value="HTTP" />
>>>                        <entry key="org.apache.cxf.rs.**address"
>>>
>> value="http://localhost:9090/a**";
>>
>>> />
>>>
>>>                        <entry key="org.apache.cxf.rs.**databinding"
>>> value="jaxb" />
>>>                        <!--<entry key="org.apache.cxf.rs.**
>>> httpservice.context"
>>>
>> value="/rest"
>>
>>>                                />  -->
>>>                </osgi:service-properties>
>>>
>>>                <ref bean="userService" />
>>>        </osgi:service>
>>>
>>> ------------------------------**------------------------------**
>>> --------------
>>> ---------------
>>>
>>> And it works great. But I find it's not a clean solution.
>>>
>>> Here the 2 problems :
>>>
>>> 1) Cannot controlling JAXBCOntext with DOSGi
>>>
>>> With DOSgi, it seems we cannot configure JAXBContent liek explained in
>>> the doc :
>>> ------------------------------
>>> <bean id="jaxbProvider"
>>> class="org.apache.cxf.jaxrs.**provider.JSONProvider">  <property
>>> name="singleJaxbContext" value="true" />
>>>                <property name="extraClass">
>>>                        <list>
>>>                                <value>org.akrogen.domain.**User</value>
>>>                        </list>
>>>                </property>
>>>        </bean>
>>> ------------------------------
>>>
>>> Because value is class name and nor Spring bean:
>>>
>>> ------------------------------
>>> *<entry key="org.apache.cxf.rs.**provider"
>>> value="org.akrogen.cxf.**MyJSONProvider" />  *
>>> ------------------------------
>>>
>>> I think it should be cool, if we can set a Spring bean is the property
>>> o*rg.apache.cxf.rs.provider
>>>
>>> *2) *AbstractJAXBProvider* should populate Generic Type?
>>>
>>> But I think to resolve the problem, it should be cool if
>>>
>>> ------------------------------
>>> AbstractJAXBProvider#**JAXBContext getJAXBContext(Class<?>  type, Type
>>> genericType) throws JAXBException
>>> ------------------------------
>>>
>>> populate the JAXBContext with the genericType too. Is it a reason that
>>> genericType is never used?
>>>
>>> Thank a lot for your help.
>>>
>>> Regards Angelo
>>>
>>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com
>

Reply via email to