CXF: No message body writer found for class - automatically mapping non-simple resources

前端 未结 10 619
野的像风
野的像风 2020-12-08 03:59

I am using the CXF rest client which works well for simple data types (eg: Strings, ints). However, when I attempt to use custom Objects I get this:

Exceptio         


        
相关标签:
10条回答
  • 2020-12-08 04:38

    None of the above changes worked for me. Please see my worked configuration below:

    Dependencies:

                <dependency>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
                    <version>3.3.2</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-rt-rs-extension-providers</artifactId>
                    <version>3.3.2</version>
                </dependency>
                <dependency>
                    <groupId>org.codehaus.jackson</groupId>
                    <artifactId>jackson-jaxrs</artifactId>
                    <version>1.9.13</version>
                </dependency>
                <dependency>
                    <groupId>org.codehaus.jettison</groupId>
                    <artifactId>jettison</artifactId>
                    <version>1.4.0</version>
                </dependency>
    

    web.xml:

         <servlet>
            <servlet-name>cfxServlet</servlet-name>
            <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
            <init-param>
                <param-name>javax.ws.rs.Application</param-name>
                <param-value>com.MyApplication</param-value>
            </init-param>
            <init-param>
                <param-name>jaxrs.providers</param-name>
                <param-value>org.codehaus.jackson.jaxrs.JacksonJsonProvider</param-value>
            </init-param>
            <init-param>
                <param-name>jaxrs.extensions</param-name>
                <param-value> 
                json=application/json 
            </param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>cfxServlet</servlet-name>
            <url-pattern>/v1/*</url-pattern>
        </servlet-mapping>
    

    Enjoy coding .. :)

    0 讨论(0)
  • 2020-12-08 04:40

    You can try with mentioning "Accept: application/json" in your rest client header as well, if you are expecting your object as JSON in response.

    0 讨论(0)
  • 2020-12-08 04:46

    If you are using jaxrs:client route of configuring, you can choose to use the JacksonJsonProvider to provide

    <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>
    

    You need to include the jackson-mapper-asl and jackson-jaxr artifacts in your classpath

    0 讨论(0)
  • 2020-12-08 04:49

    You can also configure CXFNonSpringJAXRSServlet (assuming JSONProvider is used):

    <init-param>
      <param-name>jaxrs.providers</param-name>
      <param-value>
          org.apache.cxf.jaxrs.provider.JSONProvider
          (writeXsiType=false)
      </param-value> 
    </init-param>
    
    0 讨论(0)
  • 2020-12-08 04:50

    When programmatically creating server, you can add message body writers for json/xml by setting Providers.

    JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
    bean.setAddress("http://localhost:9000/");
    
    List<Object> providers = new ArrayList<Object>();
    providers.add(new JacksonJaxbJsonProvider());
    providers.add(new JacksonJaxbXMLProvider());
    bean.setProviders(providers);
    
    List<Class< ? >> resourceClasses = new ArrayList<Class< ? >>();
    resourceClasses.add(YourRestServiceImpl.class);
    bean.setResourceClasses(resourceClasses);
    
    bean.setResourceProvider(YourRestServiceImpl.class, new SingletonResourceProvider(new YourRestServiceImpl()));
    
    BindingFactoryManager manager = bean.getBus().getExtension(BindingFactoryManager.class);
    JAXRSBindingFactory restFactory = new JAXRSBindingFactory();
    restFactory.setBus(bean.getBus());
    manager.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, restFactory);
    
    bean.create();
    
    0 讨论(0)
  • 2020-12-08 04:50

    In my scenario, i faced similar error, when the rest url without port number is not properly configured for load balancing. I verified the rest url with portnumber and this issue was not occurring. so we had to update the load balancing configuration to resolve this issue.

    0 讨论(0)
提交回复
热议问题