Thanks,indeed the default JSON Provider should manage XMLRootElement
annotated classes without any additional configuration.
Tom, do you work with OSGI ? Jettison bundle may need to be installed there
Cheers, Sergey
On 22/05/12 18:37, Shane Saunders wrote:
Tom,
This is what I setup for a very basic sample project that I created for our
project to use as a starting point for JSON. I think your setup looks good,
but I did not use the JSON Provider parameters that you have setup. I built
this with CXF 2.5.2. It was able to (un)marshall the JSON correctly for me
on the server side and I used a similar setup for the WebClient class.
beans.xml:
...
<jaxrs:server id="myServer" address="/sample">
<jaxrs:providers>
<ref bean="jsonProvider" />
</jaxrs:providers>
<jaxrs:serviceBeans>
<ref bean="myBean" />
</jaxrs:serviceBeans>
</jaxrs:server>
<bean id="myBean" class="com.hp.exstream.sample.SampleRestJsonImpl" />
<bean id="jsonProvider"
class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="ignoreNamespaces" value="true" />
</bean>
...
Web Service Interface class:
@Path("/")
public interface SampleRestJson {
@POST
@Produces("application/json")
@Consumes("application/json")
@ElementClass(response = ResponseData.class, request =
RequestData.class)
@Path("/request")
public ResponseData request1(RequestData req);
}
RequestData:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class RequestData {
private String stringData;
private int intData;
...
}
ResponseData:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseData {
private String stringData;
private int intData;
...
}
HTH,
Shane
On Tue, May 22, 2012 at 10:49 AM,<[email protected]> wrote:
After spending a couple of days trying to get JAXB and JSON working with a
JAX-RS service I found that the following was required. It wasn't clear to
me from the documentation or samples that explicit declarations of the JAXB
objects in the service bean configuration was required. My initial
assumption was that there was a default JSONProvider instance that didn't
require configuration, and that any object with the @XmlRootElement
annotation could be marshaled.
The following is the correct method for configuring a JAX-RS service using
JSON as the communication protocol?
Web resource interface:
@Path("users")
public interface RestUserService {
@GET
@Path("/{name}")
@Consumes("application/json")
@Produces("application/json")
public Response findUser(@PathParam("name") String name);
@POST
@Consumes("application/json")
@Produces("application/json")
public Response create(User user);
}
Spring bean definition:
<!-- This provider is required when Web resources are using JSON as
the protocol -->
<bean id="jsonProvider"
class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
<property name="singleJaxbContext" value="true" />
<property name="jaxbElementClassNames">
<list>
<value>com.thomsonreuters.services.userservice._2012_02_01.User</value>
</list>
</property>
</bean>
<jaxrs:server id="restServices" address="/rest">
<jaxrs:serviceBeans>
<ref bean="restUserService" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider" />
</jaxrs:providers>
</jaxrs:server>
Tom