Hi,

I was using a forward slash in all my tests, for example : 
classpath:/rdf-stylesheet.xsl

but perhaps, given that a classloader is asked to load a resource
explicitly there is no need for this extra slash - but please use '/'
for a while.

> application/xml+rdf

XSLTJaxbProvider has static Produces/Consumes values, particularly,
@Produces has no "application/xml+rdf" in the list.

To make XSLTJaxbProvider recognize it you can customize its Produces
values, when registering a provider, for :

<util:list id="mediaTypes">
<value>application/xml</value>
<value>application/xml+rdf</value>
</util:list>

<bean id="xsltProvider"
class="org.apache.cxf.jaxrs.provider.XSLTJaxbProvider">
<property name="produceMediaTypes" ref="mediaTypes"/>
</bean>

Actually, XSLTJaxbProvider has "application/*+xml" so it has to work...
I just checked, it should be

application/rdf+xml rather than

application/xml+rdf ?

But if you do need application/xml+rdf

then please use the explicit customization ...

In meantime, may be I should also add "application/xml+*" to
XSLTJaxbProvider

Hope it helps, Sergey

 

-----Original Message-----
From: XeN0s [mailto:[email protected]] 
Sent: 30 May 2009 14:11
To: [email protected]
Subject: Re: How to use cxf 2.2.2 jaxrs XSLTJaxbProvider feature ?


I just investigate a little.

In application log, I found :

2009-05-30 14:54:59 [org.apache.cxf.jaxrs.provider.XSLTJaxbProvider]
WARN  -
No template is available at : classpath:rdf-stylesheet.xsl

In XSLTJaxbProvider, there is a bug : 

 protected Templates createTemplates(String loc) {
        try {
            InputStream is = null;
            if (loc.startsWith("classpath:")) {
                String path = loc.substring("classpath:".length() + 1);
    
                // ===> path actually is set with "df-stylesheet.xsl"

                is =
this.getClass().getClassLoader().getResourceAsStream(path);
            } else {
                File f = new File(loc);
                if (f.exists()) {
                    is = new FileInputStream(f);
                }
            }
            if (is == null) {
                LOG.warning("No template is available at : " + loc);
                return null;
            }
            
            Reader r = new BufferedReader(
                           new InputStreamReader(is, "UTF-8"));
            Source source = new StreamSource(r);
            if (factory == null) {
                factory =
(SAXTransformerFactory)TransformerFactory.newInstance();
                if (uriResolver != null) {
                    factory.setURIResolver(uriResolver);
                }
            }
            return factory.newTemplates(source);
            
        } catch (Exception ex) {
            LOG.warning("No template can be created : " +
ex.getMessage());
        }
        return null;
    }


To avoid this bug, I modified my endpoint configuration : 

        <util:map id="outMediaTemplates">
                <entry key="application/xml+rdf" value="classpath:
rdf-stylesheet.xsl" />
        </util:map>

With this, Templates object is correctly created (maybe a JIRA issue
will be
needed ?)

But it doesn't solve my base problem : when calling the service
/prodservice, I still get a ".No message body writer found for response
class : ProductsDTO." html error page. 
-- 
View this message in context:
http://www.nabble.com/How-to-use-cxf-2.2.2-jaxrs-XSLTJaxbProvider-featur
e---tp23792102p23793284.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to