【问题标题】:CXF 3.0 and Spring - No message body reader has been found for response ClassCXF 3.0 和 Spring - 没有为响应类找到消息正文阅读器
【发布时间】:2015-05-31 18:22:50
【问题描述】:

我正在为一个发送简单响应的服务编写一个基于 JSX-RS 的 Spring+CXF 客户端,如下所示。

JSON:响应

{
    "message": "Hey Karthik"
}

我的 spring.xml 中有以下配置:

<jaxrs:providers>
<bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
<property name="dropRootElement" value="true" />
</bean>
</jaxrs:providers>

我的实体类是这样的

@XmlRootElement
public class HiModel {

    private String message;

    public HiModel(){}
    .
    .
    .
}

我的 JAX-RS 客户端是这样的:

@Test
public void getMessage(){
    WebClient client = WebClient.create("http://localhost:8182");
    client.path("hiService/sayHi/hi");
   client.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON);
    Response r = client.get();
    System.out.println(r.readEntity(HiModel.class));

}

我收到错误:没有为 com.karthik.model.HiModel 类找到消息正文阅读器,ContentType: application/json

我该如何解决?我选择作为客户编写的方法有很多问题,但我首先需要解决这个问题。请帮忙。

编辑1:我可以解决它

System.out.println(r.readEntity(String.class));

但是,我如何将实体解析为 HiModel.class

【问题讨论】:

  • 您的问题令人困惑,请准确说明您的问题是什么
  • 尝试创建List 并将JSONProvider 添加到列表中。然后WebClient.create("...", list);
  • WebClient.create("...", locationOfConfigFile);。请参阅WebClient API

标签: json spring cxf jax-rs


【解决方案1】:

以防它帮助某人。我有类似的情况,我设法使用 Jackson JSON 库解决了它。使用您的示例:

WebClient client = WebClient.create("http://localhost:8182/hiService/sayHi/hi");
Response r = client.accept("application/json").get();       
MappingJsonFactory factory = new MappingJsonFactory();
JsonParser parser = factory.createJsonParser((InputStream)r.getEntity());
HiModel hiModel= parser.readValueAs(HiModel.class);

Apache CXF JAX-RS 原型中实际上存在非常相似的测试。

【讨论】:

    【解决方案2】:

    将其添加到 webclient 对象。

    List<Object> providers = new ArrayList<>(); // add custom providers if any providers.add(new JacksonJaxbJsonProvider()); WebClient client = WebClient.create(ENDPOINT_ADDRESS,providers);

    如果你没有使用spring来配置cxf那么:

    1) 在 Web.xml 中

    <servlet>
        <display-name>CXFNonSpringJaxrsServlet</display-name>
        <servlet-name>CXFNonSpringJaxrsServlet</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.jaxrs.JaxRsConfigApplication
            </param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    2) 在 JaxRsConfigApplication.java 上

    public class JaxRsConfigApplication extends Application {
    
    
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<>();
        resources.add(ServicioPistaRest.class);
        resources.add(ConsultarDatosSolicitud.class);
         return resources;
    }
    
    
    @Override
    public Set<Object> getSingletons() {
        Set<Object> classes = new HashSet<>();
        JacksonJaxbJsonProvider jacksonJaxbJsonProvider = new JacksonJaxbJsonProvider();
        classes.add(jacksonJaxbJsonProvider);
        return classes;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2014-06-05
      • 1970-01-01
      相关资源
      最近更新 更多