Thank you Sergey,
Yes, this is a REST service built on a JAXWS Provider.
I have tried doing it two ways, one way uses an OSGi bundle activator to
create the HTTP endpoint, and there is no configuration file. So I don't
know how to set the JAXB Marshaller property, because the only object I'm
seeing is the DOMSource.
The other way I tried it is with regular JAXB annotations creating REST
service and giving it an HTTP endpoint by using a blueprint configuration
file. This would be my preferred way to create REST services going
forward.
But I don't know how to set the JAXB Marshaller property in the blueprint
file. I tried this:
<bean id="greetingBean" class="com.cn.dsa.service.GreetingServiceImpl"/>
<jaxrs:server id="greetingService" address="/greeting">
<jaxrs:serviceBeans>
<ref component-id="greetingBean" />
</jaxrs:serviceBeans>
<jaxrs:dataBinding>
<bean class="org.apache.cxf.jaxb.JAXBDataBinding">
<property name="marshallerProperties">
<map>
<entry>
<key><value>com.sun.xml.bind.xmlDeclaration</value></key>
<value type="boolean">true</value>
</entry>
</map>
</property>
</bean>
</jaxrs:dataBinding>
</jaxrs:server>
But I get this error:
org.apache.cxf.interceptor.Fault: Unmarshalling Error:
javax.xml.transform.dom.DOMSource is not known to this context
at
org.apache.cxf.jaxrs.provider.DataBindingProvider.readFrom(DataBindingProvi
der.java:76)
at
org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.
java:1189)
at
org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1
137)
at
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:686)
at
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:646
)
at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInI
nterceptor.java:237)
at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInIn
terceptor.java:98)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
n.java:271)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationO
bserver.java:121)
at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDe
stination.java:239)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(Servle
tController.java:218)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController
.java:163)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController
.java:137)
at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringSer
vlet.java:158)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(Abstract
HTTPServlet.java:243)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPSer
vlet.java:163)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
. . .
--
Miles Poindexter
Data & Service Architecture
Condé Nast
ph: 212-790-6692
mobile: 347-967-8944
fax: 212-790-1891
[email protected]
<applewebdata://6D7C2D39-4D16-42A7-8457-9A8FCE0ED464/miles_poindexter@conde
nast.com>
On 4/24/13 5:07 PM, "Sergey Beryozkin" <[email protected]> wrote:
>Hi
>On 24/04/13 20:29, Poindexter, Miles wrote:
>> Hello to everyone on the list.
>> I'm a new developer using ServiceMix and building some REST services
>>using CXF and JAX-RS 2.0 which uses javax.xml.ws.Provider.
>>
>FYI, in this case your are working with JAX-WS API,
>In this case you should probably configure JAXB DataBinding in your
>jaxws endpoint and set up a JAXB Marshaller property
>(com.sun.xml.bind.xmlDeclaration) which will instruct JAXB to retain the
>declaration
>
>You can see an example at
>http://cxf.apache.org/docs/jaxb.html
>
>Sergey
>
>
>> They work great.
>> The only glitch is now one client wants to see the XML declaration in
>>the response XML.
>> They are claiming the XML is not valid without the declaration.
>> Even though they are wrong, and its valid, I am still curious if I can
>>somehow get the declaration to show up?
>>
>> To test this, I built a stripped down service that looks like this:
>>
>> @WebServiceProvider()
>> @ServiceMode(value = Service.Mode.PAYLOAD)
>> public class RestSourcePayloadProvider implements Provider<DOMSource> {
>>
>> public DOMSource invoke(DOMSource request) {
>> if (httpMethod.equalsIgnoreCase("POST")) {
>> if (path.equals("/cxf/test")) {
>> return testResponse();
>> }
>> }
>> }
>>
>> private DOMSource testResponse() {
>> DocumentBuilderFactory factory;
>> DocumentBuilder builder;
>> Document document = null;
>> DOMSource response = null;
>>
>> try {
>> factory = DocumentBuilderFactory.newInstance();
>> //factory.setValidating(true);
>> builder = factory.newDocumentBuilder();
>> InputStream testResponse =
>>getClass().getResourceAsStream("/files/test.xml");
>>
>> document = builder.parse(testResponse);
>> response = new DOMSource(document);
>> } catch (Exception e) {
>> e.printStackTrace();
>> }
>> return response;
>> }
>> }
>>
>> This service grabs an xml file that has the XML declaration, creates
>>the Document from it, and then the DOMSource from the Document and
>>returns the DOMSource.
>>
>> test.xml file:
>> [code]
>> <?xml version="1.0" encoding="utf-8" ?>
>> <Test>
>> <name>John</name>
>> <id>123456</id>
>> </Test>
>>
>> But the service returns only:
>> <Test>
>> <name>John</name>
>> <id>123456</id>
>> </Test>
>>
>> What is the recommended way in the current version of ServiceMix to get
>>this response to NOT strip out the XML declaration?
>>
>> miles
>> --
>> Miles Poindexter
>> Data& Service Architecture
>> Condé Nast
>> ph: 212-790-6692
>> mobile: 347-967-8944
>> fax: 212-790-1891
>>
>>[email protected]<applewebdata://6D7C2D39-4D16-42A7-8457-9A8
>>FCE0ED464/[email protected]>
>>
>>
>>
>
>
>--
>Sergey Beryozkin
>
>Talend Community Coders
>http://coders.talend.com/
>
>Blog: http://sberyozkin.blogspot.com