CXF 3.0和Spring - 没有找到响应类的消息正文阅读器

时间:2015-03-27 12:14:38

标签: json spring cxf jax-rs

我正在为一个发送简单响应的服务编写基于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

2 个答案:

答案 0 :(得分:2)

如果它可以帮助某人。我有类似的情况,我设法使用杰克逊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原型中实际存在非常类似的测试。

答案 1 :(得分:1)

将其添加到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;
}

}