我收到以下错误:

WARNING: No message body writer has been found for response class ArrayList.

在以下代码中:

    @GET
    @Consumes("application/json")
    public List getBridges() {
        return  new ArrayList(bridges);
    }

我知道CXF可以处理这种情况,因为我之前已经完成了 - 使用一个平台来定义幕后的CXF和相关的maven工件(即我不知道它是如何完成的)。

所以, 问题是 :如何在不添加XML绑定或其他源代码修改的情况下让CXF支持这一点?

请注意以下答案解决了XML绑定的相同问题,这对我的情况不满意: 没有为响应类ArrayList找到消息正文编写器

#1楼 票数:5 已采纳

问题原来是一个简单的缺少Accept标头:

Accept: application/json

将此添加到请求可以解决问题。

#2楼 票数:0

如果您使用的是杰克逊,您可以编写自定义消息正文编写器

public class KPMessageBodyWriter implements
        MessageBodyWriter<ArrayList<String>> {

    private static final Logger LOG = LoggerFactory.getLogger(KPMessageBodyWriter.class);
    public boolean isWriteable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {

        return true;
    }

    public long getSize(ArrayList<String> t, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {

        return t.size();
    }

    public void writeTo(ArrayList<String> t, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
            WebApplicationException {

        ObjectMapper mapper = new ObjectMapper();

            mapper.writeValue(entityStream, t);

    }

}

在cx配置文件中添加提供程序

<jaxrs:providers>
     <bean class="com.kp.KPMessageBodyWriter" />
</jaxrs:providers>

#3楼 票数:0

最好的事情确实是使用杰克逊。 以下文章详细描述了为什么以及如何做到这一点。

为了你的方便,我总结了主要的事情:

您需要将Jackson设置为提供程序,最好的方法是使用自定义应用程序覆盖javax.ws.rs.core.Application

您需要添加以下代码

@Override


  public Set<Object> getSingletons() {
        Set<Object> s = new HashSet<Object>();

        // Register the Jackson provider for JSON

        // Make (de)serializer use a subset of JAXB and (afterwards) Jackson annotations
        // See http://wiki.fasterxml.com/JacksonJAXBAnnotations for more information
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
        AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
        AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
        mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
        mapper.getSerializationConfig().setAnnotationIntrospector(pair);

        // Set up the provider
        JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
        jaxbProvider.setMapper(mapper);

        s.add(jaxbProvider);
        return s;
      }

最后,不要忘记将杰克逊加入你的专家

<dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>2.7</version>
      <scope>compile</scope>
</dependency>

#4楼 票数:0

遇到同样的问题,我终于解决了这个问题。 在你的Spring context.xml定义bean:

<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>

并在<jaxrs:server>中将其用作提供者:

<jaxrs:server id="restService" address="/resource">
    <jaxrs:providers>
        <ref bean="jsonProvider"/>
    </jaxrs:providers>
</jaxrs:server>

在你的Maven pom.xml中添加:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.0</version>
</dependency>

  ask by ash translate from so

未解决问题?本站智能推荐:

1回复

没有为类org.apache.cxf.message.MessageContentsList找到消息正文编写器,ContentType:application/xml

我已经使用camel-cxf组件支持实现了rest服务,以将响应路由到activemq队列。 现在,当运行服务url时,我得到了没有消息正文编写器org.apache.cxf.message.MessageContentsList,ContentType:application / xml消息
1回复

Camel&CXF&REST:错误找不到类java.util.ArrayList,ContentType:application/json的消息正文编写器

在我的Spring配置文件中: 服务界面: 上面的代码有效! 我可以将get请求发送到URl并得到JSON响应。 现在,我做了一个小小的更改:我不是通过XML配置定义Web服务的URL(和路由),而是通过Java代码定义它们: 当我点击Web服务URL时,出现500 Inter
1回复

找不到响应类ArrayList[jboss7]的消息正文编写器

我们的带有静态服务的应用程序在jboss 6上可以正常运行,升级到jboss 7后,其余的服务都无法正常工作。 我们遇到的异常是http 500内部服务器错误: 应用程序具有以下依赖性。 经过分析,我发现jboss具有rest easy api,它与cxf库冲突。 我尝试了网络上
2回复

在osgi中使用带有cxf的jackson提供程序(未找到消息正文编写器)

我总是得到错误: Apr 09, 2014 2:03:19 AM org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage WARNING: No message body writer has
1回复

CXF@PUT请求“未找到消息正文编写器”异常

我完全被卡住了! 花了很多时间没有进展... 我有一个尝试使用JUnit测试的带有CXF 3(3.1.4)的Spring 4(4.2.3.RELEASE)应用程序。 除了PUT请求之外,其他所有东西都运行良好。 我收到以下错误: 原因:javax.ws.rs.ProcessingE
1回复

没有为MultipartBody,multipart/form-data找到消息正文编写器

我通过CXF客户端调用REST URL来上传xml文件: 但是我在POST调用时遇到异常 javax.ws.rs.ProcessingException:未找到类org.apache.cxf.jaxrs.ext.multipart.MultipartBody,ContentType:m
10回复

CXF:找不到类的消息正文编写器-自动映射非简单资源

我正在使用 CXF 休息客户端,它适用于简单数据类型(例如:字符串、整数)。 但是,当我尝试使用自定义对象时,我得到了这个: 我这样称呼它: 下面是界面中的方法: restlet 库通过将 XStream 依赖项添加到它“正常工作”的路径来非常简单地做到这一点。 CXF 有没有类似的东西? 编辑
1回复

找不到响应正文的消息正文编写器

我已经用三个参数定义了名为AccountingData的类。 但是,当我尝试为REST Get请求返回此对象时,出现以下错误: 找不到响应类AccountingData的消息正文编写器。 日志记录如下:apache.cxf.jaxrs.interceptor.JAXRSOutInt