Sergey,

many thanks. It worked. The code follows.

The only thing I'd like to fix is that the namespace prefixes are ns2 ns3 etc. 
and I would like to manually set them.

public class MyJAXBElementProvider extends JAXBElementProvider {
    public String contextPath;

    @Override
    protected JAXBContext getJAXBContext(Class<?> type, Type genericType)
            throws JAXBException {
        JAXBContext jaxbContext = super.getJAXBContext(type, genericType);

        jaxbContext = JAXBContext.newInstance(contextPath);
        return jaxbContext;
    }


    /**
     * List of package names this will support for marshalling
     * E.g.  
com.axiell.arena.domain.binding:org.openarchives.oai._2:org.openarchives.oai._2_0.oai_dc:org.purl.dc.elements._1
     * @param contextPath
     */
    public void setContextPath(String contextPath) {
        this.contextPath = contextPath;
    }

}



Replace the normal jaxbProvider entry in Spring config with this.

    <bean id="jaxbProvider" 
class="com.axiell.arena.archive.oai.server.invocation.MyJAXBElementProvider" >
        <property name="contextPath" 
value="com.axiell.arena.domain.binding:org.openarchives.oai._2:org.openarchives.oai._2_0.oai_dc:org.purl.dc.elements._1"/>
    </bean>




Sergey Beryozkin wrote:

Hi Gareth

It all makes sense (I think).
Unfortunately it is not currently possible to explicitly configure
JAXBElementProvider for it to be aware of all the additional
packages/classes which may need to be dealt with when unmarshalling a given
xml instance. But it could be a good enhancement indeed.

There're few options/workarounds at the moment :

1. Write a custom message body reader extending CXF JAXBElementProvider and
overriding its createJaxbContext method by returning a statically created
JAXBContext aware of OAI_DC_PACKAGE, provided that a class for which a
context needs to be created is in the right package.

2. Try CXF JAXBDataBinding, by embedding the following fragment in the
jaxrs:server:

<jaxrs:dataBinding>
      <bean class="org.apache.cxf.jaxb.JAXBDataBinding">
        <property name="namespaceMap">
                <map>
                        <entry>
                        
<key><value>http://cxf.apache.org/anonymous_complex_type/</value></key>
                        <value>BeepBeep</value>
                        </entry>
                </map>
        </property>
      </bean>
      </jaxrs:dataBinding>

The namespaceMap property is just an example on how  CXF JAXBDataBinding can
be configured but I believe one can specify additional packages/classes for
which JAXBContexts will be precreated.

Perhaps, it is also possible to use JAXBContext explicitly in your code.

Hope it helps, Sergey



On Wed, Apr 14, 2010 at 12:01 PM, Gareth Hughes
<[email protected]><mailto:[email protected]>wrote:

> Hi,
>
> Background: I'm implementing an OAIPMH repository server using JAXRS.
> I've written the client (called a harvester) already and the server is
> up and running.
>
> The server returns XML using the OAIPMH namespace
> http://www.openarchives.org/OAI/2.0/ and this thing is used to return
> information from archives and libraries. The clever bit is that the
> information about each entry can be in any other xml format. Usually
> Dublin Core which is a different xml namespace.
>
> In code I use objectFactory to build the OAIPMH objects and then add in
> my other object from a different namespace. When the server returns I get
>
> JAXBException occurred : com.foo.domain.binding.CatalogueSearchResultDTO is
> not known to this context.
>
> This class can be unmarshalled but the server doesn't know where to find
> this class.
>
> When I wrote the Harvester, which unmarshal all the xml in the other
> direction, I had to write lines like this to get my marshaller to know
> about all the possible packages:
>
> String OAI_DC_PACKAGE
>
> ="gov.loc.mets:org.openarchives.oai._2_0.oai_dc:org.purl.dc.elements._1:gov.loc.marc21.slim:org.openarchives.oai._1_1.oai_marc";
> private Unmarshaller oaiDCUnmarshaller =
> JAXBContext.newInstance(OAI_DC_PACKAGE).createUnmarshaller();
>
>
> What's equivalent of this for the Spring config of the jaxrs:server? How
> do I tell it what java packages it can unmarshal?
>
> I currently have the following.
>
>    <bean id="jaxbProvider"
> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider" />
>
>    <jaxrs:server id="oaipmhServiceServer" address="/">
>        <jaxrs:serviceBeans>
>            <ref bean="oaiServerInvocation" />
>        </jaxrs:serviceBeans>
>        <jaxrs:providers>
>            <ref bean="jaxbProvider" />
>        </jaxrs:providers>
>    </jaxrs:server>
>
> Hope this all makes sense
>
> Is there a reference guide for the values in jaxrs:server? I found that
> the API docs have no comments.
>
>
> Thanks very much
>
> Gareth Hughes
>
> Axiell Limited (registered no. 01607548) is a private limited company
> registered in England. The address of the Registered Office is Unit 2, Hall
> View Drive, Bilborough, Nottingham, NG8 4GD. VAT registration no. GB 610
> 5069 78.
>
> DISCLAIMER:
> This e-mail is only for the use of the intended recipient and may contain
> confidential information. If you have received this e-mail in error, please
> notify the sender immediately, delete it and do not use or disseminate its
> contents. Any views or opinions are solely those of the author and do not
> necessarily represent those of the Company. This e-mail may be monitored.
>

________________________________
Axiell Limited (registered no. 01607548) is a private limited company 
registered in England. The address of the Registered Office is Unit 2, Hall 
View Drive, Bilborough, Nottingham, NG8 4GD. VAT registration no. GB 610 5069 
78.

DISCLAIMER:
This e-mail is only for the use of the intended recipient and may contain 
confidential information. If you have received this e-mail in error, please 
notify the sender immediately, delete it and do not use or disseminate its 
contents. Any views or opinions are solely those of the author and do not 
necessarily represent those of the Company. This e-mail may be monitored.

Reply via email to