CXF:警告:没有为响应类ArrayList找到消息正文编写器

时间:2014-04-20 01:37:12

标签: cxf

我收到以下错误:

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绑定的相同问题,这对我的情况不满意: No message body writer has been found for response class ArrayList

4 个答案:

答案 0 :(得分:4)

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

Accept: application/json

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

答案 1 :(得分: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>

答案 2 :(得分:0)

最好的事情确实是使用杰克逊。 以下post详细说明了为什么以及如何执行此操作。

为了您的方便,我总结了主要内容:

您需要将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>

答案 3 :(得分:0)

遇到同样的问题我终于解决了这个问题。在你的Spring context.xml define 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>