Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Exception in thread "main" org.apache.cxf.interceptor.Fault: .No message body writer found for class : class com.company.datatype.normal.MyObject.
- at org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:523)
- at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
- at org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:438)
- at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:177)
- at $Proxy13.execute(Unknown Source)
- at com.company.JaxTestClient.main(JaxTestClient.java:26)
- Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException: .No message body writer found for class : class com.company.datatype.normal.MyObject.
- at org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:491)
- at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
- at org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:515)
- ... 5 more
- JaxExample jaxExample = JAXRSClientFactory.create( "http://localhost:8111/", JaxExample.class );
- MyObject before = ...
- MyObject after = jaxExample.execute( before );
- @POST
- @Path( "execute" )
- @Produces( "application/json" )
- MyObject execute( MyObject myObject );
- //TestApi parts
- @GET
- @Path ( "test" )
- @Produces ( "application/json" )
- public Demo getDemo () {
- Demo d = new Demo ();
- d.id = 1;
- d.name = "test";
- return d;
- }
- //client config for a TestApi interface
- List providers = new ArrayList ();
- JSONProvider jsonProvider = new JSONProvider ();
- Map<String, String> map = new HashMap<String, String> ();
- map.put ( "http://www.myserviceapi.com", "myapi" );
- jsonProvider.setNamespaceMap ( map );
- providers.add ( jsonProvider );
- TestApi proxy = JAXRSClientFactory.create ( url, TestApi.class,
- providers, true );
- Demo d = proxy.getDemo ();
- if ( d != null ) {
- System.out.println ( d.id + ":" + d.name );
- }
- //the Demo class
- @XmlRootElement ( name = "demo", namespace = "http://www.myserviceapi.com" )
- @XmlType ( name = "demo", namespace = "http://www.myserviceapi.com",
- propOrder = { "name", "id" } )
- @XmlAccessorType ( XmlAccessType.FIELD )
- public class Demo {
- public String name;
- public int id;
- }
- @Produces ( "application/json" )
- @Consumes ( "application/json" )
- @Provider
- public class XstreamJsonProvider implements MessageBodyReader<Object>,
- MessageBodyWriter<Object> {
- @Override
- public boolean isWriteable ( Class<?> type, Type genericType,
- Annotation[] annotations, MediaType mediaType ) {
- return MediaType.APPLICATION_JSON_TYPE.equals ( mediaType )
- && type.equals ( Demo.class );
- }
- @Override
- public long getSize ( Object t, Class<?> type, Type genericType,
- Annotation[] annotations, MediaType mediaType ) {
- // I'm being lazy - should compute the actual size
- return -1;
- }
- @Override
- public void writeTo ( Object t, Class<?> type, Type genericType,
- Annotation[] annotations, MediaType mediaType,
- MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream )
- throws IOException, WebApplicationException {
- // deal with thread safe use of xstream, etc.
- XStream xstream = new XStream ( new JettisonMappedXmlDriver () );
- xstream.setMode ( XStream.NO_REFERENCES );
- // add safer encoding, error handling, etc.
- xstream.toXML ( t, entityStream );
- }
- @Override
- public boolean isReadable ( Class<?> type, Type genericType,
- Annotation[] annotations, MediaType mediaType ) {
- return MediaType.APPLICATION_JSON_TYPE.equals ( mediaType )
- && type.equals ( Demo.class );
- }
- @Override
- public Object readFrom ( Class<Object> type, Type genericType,
- Annotation[] annotations, MediaType mediaType,
- MultivaluedMap<String, String> httpHeaders, InputStream entityStream )
- throws IOException, WebApplicationException {
- // add error handling, etc.
- XStream xstream = new XStream ( new JettisonMappedXmlDriver () );
- return xstream.fromXML ( entityStream );
- }
- }
- //now your client just needs this
- List providers = new ArrayList ();
- XstreamJsonProvider jsonProvider = new XstreamJsonProvider ();
- providers.add ( jsonProvider );
- TestApi proxy = JAXRSClientFactory.create ( url, TestApi.class,
- providers, true );
- Demo d = proxy.getDemo ();
- if ( d != null ) {
- System.out.println ( d.id + ":" + d.name );
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jaxrs="http://cxf.apache.org/jaxrs"
- xmlns:cxf="http://cxf.apache.org/core"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
- http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
- <import resource="classpath:META-INF/cxf/cxf.xml" />
- <jaxrs:server id="TestApi">
- <jaxrs:serviceBeans>
- <ref bean="testApi" />
- </jaxrs:serviceBeans>
- <jaxrs:providers>
- <bean id="xstreamJsonProvider" class="webtests.rest.XstreamJsonProvider" />
- </jaxrs:providers>
- </jaxrs:server>
- <bean id="testApi" class="webtests.rest.TestApi">
- </bean>
- </beans>
- return MediaType.APPLICATION_JSON_TYPE.getType ().equals ( mediaType.getType () )
- && MediaType.APPLICATION_JSON_TYPE.getSubtype ().equals ( mediaType.getSubtype () )
- && type.equals ( Demo.class );
- org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet
- jaxrs.serviceClasses
- jaxrs.providers
- <servlet>
- <servlet-name>cxfservlet</servlet-name>
- <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
- <init-param>
- <param-name>jaxrs.serviceClasses</param-name>
- <param-value>webtests.rest.TestApi</param-value>
- </init-param>
- <init-param>
- <param-name>jaxrs.providers</param-name>
- <param-value>webtests.rest.XstreamJsonProvider</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <init-param>
- <param-name>jaxrs.providers</param-name>
- <param-value>
- org.apache.cxf.jaxrs.provider.JSONProvider
- (writeXsiType=false)
- </param-value>
- </init-param>
- <jaxrs:client id="serviceId"
- serviceClass="classname"
- address="">
- <jaxrs:providers>
- <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">
- <property name="mapper" ref="jacksonMapper" />
- </bean>
- </jaxrs:providers>
- </jaxrs:client>
- <bean id="jacksonMapper" class="org.codehaus.jackson.map.ObjectMapper">
- </bean>
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-rs-extension-providers</artifactId>
- <version>3.0.2</version>
- </dependency>
- <dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-jaxrs</artifactId>
- <version>1.9.0</version>
- </dependency>
- <jaxrs:providers>
- <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
- </jaxrs:providers>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement