thanks for your fast reply.
I tested it because actually I am interested in deploying services with an
interface type as input or output.
I already tested on cxf how to do it by using implementation classes, for
example, I defined a Resource interface and two implementations
ResourceImpl1 and ResourceImpl2 such that all my REST methods are declared
with a Resource type and I consider to differentiate the treatment at a
reception of a ResourceImpl1 or ResourceImpl2. In order to do that I added
the following two annotations to my Resource interface, and my
AdaptedResource class (which is the adapted java instance for serialization
and deserialization) contains an attribute which refers to the
corresponding implementation (ResourceImpl1 or ResourceImpl2).
------------------------------------------------------------------------------------
@XmlSeeAlso({ResourceImpl1.class, ResourceImpl2.class})
@XmlJavaTypeAdapter(MyResourceAdapter.class)
public interface Resource {...}
------------------------------------------------------------------------------------By curiosity, I tested MOXY without implementation classes and it works, but not for cxf, I didn't understand the problem On Wed, Feb 20, 2013 at 5:59 PM, Sergey Beryozkin <[email protected]>wrote: > Hi > > The appears to be some issue with your invocation handler, why do you need > it all ? If users had to write InvocationHandlers in order to be able to > work with CXF RS client runtime then it would not be ideal at all :-) > > Thanks, Sergey > > > On 20/02/13 16:49, allam-di wrote: > >> Hello all, >> >> I would like to use MOXY in order to handle interfaces as input arguments >> on >> my service methods. >> First, I tested MOXY data binding with interfaces as it is given in the >> following blog: >> http://blog.bdoughan.com/2010/**07/moxy-jaxb-map-interfaces-**to-xml.html<http://blog.bdoughan.com/2010/07/moxy-jaxb-map-interfaces-to-xml.html> >> >> It works oK for me, thus I can serialize and deserialize messages by >> declaring a service method with an interface argument, without defining >> any >> implementation classes of this interface. >> In order to do a similar think integrated to cxf, I followed the >> discussion >> at this link: >> http://cxf.547215.n5.nabble.**com/How-to-configure-CXF-to-** >> use-different-**JAXBContextFactory-td5281773.**html<http://cxf.547215.n5.nabble.com/How-to-configure-CXF-to-use-different-JAXBContextFactory-td5281773.html> >> >> Here is my ContextResolver Class: >> ------------------------------**----------- >> >> package project; >> >> @Provider >> public class MyContextResolver implements ContextResolver<JAXBContext> { >> private JAXBContext jc; >> >> public MyContextResolver() { >> try { >> >> jc = JAXBContext.newInstance(**MyObjectFactory.class); >> } catch(JAXBException e) { >> throw new RuntimeException(e); >> } >> } >> >> public JAXBContext getContext(Class<?> type) { >> try { >> jc = JAXBContextFactory.**createContext(new >> Class[] >> {MyObjectFactory.class}, null); >> >> return jc; >> } catch (JAXBException e) { >> e.printStackTrace(); >> } >> return null; >> } >> >> } >> >> Here is my ObjectFactory class: >> ------------------------------**----------- >> @XmlRegistry >> public class MyObjectFactory { >> >> >> public Customer createCustomer() { >> return createInstance(Customer.class)**; >> >> } >> ... >> >> >> private<T> T createInstance(Class<T> anInterface) { >> return (T) Proxy.newProxyInstance(**anInterface.getClassLoader(), >> new >> Class[] {anInterface}, new InterfaceInvocationHandler()); >> } >> >> private static class InterfaceInvocationHandler implements >> InvocationHandler { >> >> private Map<String, Object> values = new HashMap<String, >> Object>(); >> >> public Object invoke(Object proxy, Method method, Object[] args) >> throws Throwable { >> String methodName = method.getName(); >> if(methodName.startsWith("get"**)) { >> return values.get(methodName.**substring(3)); >> >> } >> else { >> values.put(methodName.**substring(3), args[0]); >> return null; >> } >> } >> >> } >> } >> >> Here is my bean.xml file: >> ------------------------------**----- >> <?xml version="1.0" encoding="UTF-8"?> >> <beans >> xmlns="http://www.**springframework.org/schema/**beans<http://www.springframework.org/schema/beans> >> " >> >> xmlns:xsi="http://www.w3.org/**2001/XMLSchema-instance<http://www.w3.org/2001/XMLSchema-instance> >> " >> xmlns:jaxrs="http://cxf.**apache.org/jaxrs <http://cxf.apache.org/jaxrs>" >> xsi:schemaLocation=" >> http://www.springframework.**org/schema/beans<http://www.springframework.org/schema/beans> >> http://www.springframework.**org/schema/beans/spring-beans.**xsd<http://www.springframework.org/schema/beans/spring-beans.xsd> >> http://cxf.apache.org/jaxrs >> http://cxf.apache.org/schemas/**jaxrs.xsd<http://cxf.apache.org/schemas/jaxrs.xsd> >> "> >> <import resource="classpath:META-INF/**cxf/cxf.xml" /> >> <import resource="classpath:META-INF/**cxf/cxf-servlet.xml" /> >> <jaxrs:server id="test" address="/"> >> <jaxrs:serviceBeans> >> <ref bean="myWebService" /> >> </jaxrs:serviceBeans> >> <jaxrs:providers> >> <ref bean="MOXYProvider" /> >> </jaxrs:providers> >> </jaxrs:server> >> >> <bean id="MOXYProvider" class="project.**MyContextResolver" /> >> <bean id="myWebService" class="project.Service" /> >> </beans> >> >> Here is a the constructor of my service class: >> ------------------------------**---------------------- >> public Service(){ >> >> ObjectFactory objectFactory = new ObjectFactory(); >> Customer c = objectFactory.createCustomer()**; >> c.setName("defaultName"); >> Address address = objectFactory.createAddress(); >> address.setCity("**defaultAddress"); >> address.setStreet("**defaultStreet"); >> c.setAddress(address); >> >> this.resources.put(c.getName()**, s); >> >> } >> >> and here is my GET method: >> >> @GET >> @Path("/resources/{name}/") >> public Customer getCustomer(@PathParam("name") String name) { >> return this.resources.get(name); >> } >> >> When I call my service, I get the following error: >> >> Exception in thread "main" Status : 500 >> Headers : >> Date : Wed, 20 Feb 2013 16:02:30 GMT >> Content-Length : 65 >> Content-Type : text/plain >> Connection : close >> Server : Apache-Coyote/1.1 >> Error message : >> No message body writer has been found for response class $Proxy5. >> >> at >> org.apache.cxf.jaxrs.client.**ClientProxyImpl.checkResponse(** >> ClientProxyImpl.java:250) >> at >> org.apache.cxf.jaxrs.client.**ClientProxyImpl.**handleResponse(** >> ClientProxyImpl.java:517) >> at >> org.apache.cxf.jaxrs.client.**ClientProxyImpl.**doChainedInvocation(** >> ClientProxyImpl.java:487) >> at >> org.apache.cxf.jaxrs.client.**ClientProxyImpl.invoke(** >> ClientProxyImpl.java:188) >> at $Proxy18.getResource(Unknown Source) >> at project.Client.main(Client.**java:35) >> >> >> >> Any idea about this error please? >> >> Regards, >> >> Diana >> >> >> >> >> >> >> >> >> >> >> >> >> -- >> View this message in context: http://cxf.547215.n5.nabble.** >> com/How-to-configure-cxf-to-**use-MOXY-Jaxb-for-RESTful-**tp5723506.html<http://cxf.547215.n5.nabble.com/How-to-configure-cxf-to-use-MOXY-Jaxb-for-RESTful-tp5723506.html> >> Sent from the cxf-user mailing list archive at Nabble.com. >> > > > -- > Sergey Beryozkin > > Talend Community Coders > http://coders.talend.com/ > > Blog: http://sberyozkin.blogspot.com >
